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

时间:2012-11-06 16:16:05

标签: c++ qt user-interface qlineedit

我正在实施一个基于文本的待办事项。我有一个CommandInput小部件,它继承自QLineEdit。基本上有几个命令,从关键字“添加”,“删除”,“编辑”等开始。

我想实现一些快捷方式。

  1. Ctrl+A这样当小部件具有焦点时,我可以setText("add \"\""),光标位于倒数第二个位置,因此它似乎是add "|"
  2. Tab以便当窗口小部件具有焦点时,当用户输入第一个关键字时,例如add,那么我可以完成命令add "|"
  3. 关键问题是当窗口小部件具有焦点时,快捷方式不起作用。我尝试了以下方法:

    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 个答案:

答案 0 :(得分:1)

覆盖keyPressEvent可能是首选方法。我猜测“Tab”不能按预期工作的原因是因为你在发出break之后没有add_activated()语句。对于“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)机器。

答案 1 :(得分: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);
}