【问题标题】:QLineEdit could not set shortcuts when it's in focusQLineEdit 聚焦时无法设置快捷方式
【发布时间】:2012-11-06 16:16:05
【问题描述】:

我正在实施一个基于文本的待办事项程序。我有一个从QLineEdit 继承的CommandInput 小部件。基本上有几个命令,以关键字“add”、“delete”、“edit”等开头。

我想实现一些快捷方式。

  1. Ctrl+A 这样当小部件有焦点时,我可以setText("add \"\""),光标在倒数第二个位置,所以它看起来是add "|"
  2. Tab 这样当小部件有焦点时,当用户输入第一个关键字时,例如,add,然后我可以完成对add "|" 的命令

关键问题是当小部件有焦点时,快捷方式不起作用。我尝试了以下方法:

1/ 覆盖keyPressEventTab 键无法按预期工作。即使它有效,我也不知道如何为像 Ctrl+A 这样的 keySequence 做到这一点。

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()));
}

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

【问题讨论】:

    标签: c++ qt user-interface qlineedit


    【解决方案1】:

    覆盖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) 机器。

    【讨论】:

    • 非常感谢!!!!!!所有组合键现在都可以使用。虽然“选项卡”仍然不起作用,但我选择了另一种方式,使用 LeftQuotation 代替。谢谢!=)
    【解决方案2】:

    为了让 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);
    }
    

    【讨论】:

      猜你喜欢
      • 2022-12-18
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多