3

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

我想实现一些快捷方式。

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

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

1/ 覆盖keyPressEventTab密钥无法按预期工作。即使它有效,我也不知道如何为 keySequence (如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()));
}

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

4

2 回答 2

2

覆盖keyPressEvent可能是这里的首选方法。我猜想“Tab”不能按预期工作的原因是因为你break在 emitting 之后没有声明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)机器。

于 2012-11-06T18:09:44.700 回答
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);
}
于 2020-07-23T06:08:43.333 回答