QLineEdit无法在焦点状态下设置快捷键

3
我正在实现一个基于文本的待办事项程序。我有一个继承自QLineEditCommandInput小部件。基本上有几个命令,以关键字“add”,“delete”,“edit”等开头,还有一些其他命令。
我想要实现一些快捷方式。
  1. Ctrl+A,这样当小部件获得焦点时,我可以使用setText("add \"\""),光标位于倒数第二个位置,所以它看起来像add "|"
  2. Tab,这样当小部件获得焦点时,当用户输入第一个关键字,例如add,然后我可以将命令完成为add "|"
关键问题是当小部件获得焦点时,快捷方式不起作用。我尝试了以下方法:
1/ 重写keyPressEventTab键无法正常工作。即使它起作用,我也不知道如何处理像Ctrl+A这样的键序列。
void CommandInput::keyPressEvent(QKeyEvent *keyEvent)

{
    switch(keyEvent->key())
    {
    case Qt::Key_Tab;
        emit add_activated();
    default:
        QLineEdit::keyPressEvent(keyEvent);
    }
}

2/ 在初始化时创建快捷方式。这也不起作用。

CommandInput::CommandInput(QWidget *parent)
    : QLineEdit(parent)
{
    tab_shortcut = new QShortcut(QKeySequence("Tab"),this);
    add_shortcut = new QShortcut(QKeySequence("Ctrl+A"),this);

    connect(tab_shortcut, SIGNAL(activated()),
            this, SIGNAL(tab_activated()));
    connect(add_shortcut, SIGNAL(activated()),
            this, SIGNAL(add_activated()));
}

希望你能帮忙解决这个问题,谢谢!
2个回答

2

重写keyPressEvent可能是这里首选的方法。我猜测“Tab”无法按预期工作的原因是在发出add_activated()之后没有加上break语句。对于“Ctrl+A”,您需要查看键事件的modifiers()。因此,您的keyPressEvent代码应该类似于:

void CommandInput::keyPressEvent(QKeyEvent* keyEvent)
{
   if (keyEvent->key() == Qt::Key_Tab)
   {
      emit add_activated();
   }
   else if (keyEvent->key() == Qt::Key_A && 
            keyEvent->modifiers() == Qt::ControlModifier)
   {
      // Code for Ctrl+A goes here.
   }
   else
   {
      QLineEdit::keyPressEvent(keyEvent);
   }
}

这在我的(Linux)机器上似乎有效。

非常感谢!!!!所有组合键现在都可以使用了。虽然“Tab”仍然无法使用,但我选择了另一种替代方式,使用LeftQuotation代替。谢谢!=) - Vincent Li

0
为了使Tab键起作用,我不得不在event()函数中捕获keyPressEvent事件,就像这样:
bool MyQTextBox::event(QEvent* event) {
    if (event->type() == QEvent::KeyPress) { // this did the trick for me
        this->keyPressEvent(dynamic_cast<QKeyEvent*>(event));
        return true;
    }
    return QWidget::event(event);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接