QLineEdit 在焦点中时无法设置快捷方式

QLineEdit could not set shortcuts when it's in focus

本文关键字:设置 快捷方式 焦点 QLineEdit      更新时间:2023-10-16

我正在实现基于文本的待办事项程序。我有一个CommandInput小部件,该小部件从QLineEdit继承。基本上有几个命令,从关键字" 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()));
}

希望您可以在这个问题上帮助我。谢谢!

覆盖keyPressEvent可能是这里的首选方法。我猜测"选项卡"不按预期工作的原因是因为发射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键正常工作,我必须在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);
}