我正在实施一个基于文本的待办事项。我有一个CommandInput
小部件,它继承自QLineEdit
。基本上有几个命令,从关键字“添加”,“删除”,“编辑”等开始。
我想实现一些快捷方式。
Ctrl+A
这样当小部件具有焦点时,我可以setText("add \"\"")
,光标位于倒数第二个位置,因此它似乎是add "|"
Tab
以便当窗口小部件具有焦点时,当用户输入第一个关键字时,例如add
,那么我可以完成命令add "|"
关键问题是当窗口小部件具有焦点时,快捷方式不起作用。我尝试了以下方法:
1 /覆盖keyPressEvent
。 Tab
密钥无法按预期工作。即使它有效,我也不知道如何为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()));
}
希望你能在这个问题上帮助我。谢谢!
答案 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);
}