Qt - 有没有办法在输入特定键时发出信号?
Posted
技术标签:
【中文标题】Qt - 有没有办法在输入特定键时发出信号?【英文标题】:Qt - Is there a way to emit a signal when a particular key is typed? 【发布时间】:2014-04-17 15:27:24 【问题描述】:I am working on a project in Qt 4.7 where a have a QListWidget
which needs to perform a certain function when an item from the list is selected.此处的特定功能并不重要,因此对于此示例,假设是将值打印到std::cout
。我现在拥有它,以便在双击一个值时执行此操作,如下所示:
connect(ui->myList, SIGNAL(doubleClicked(QModelIndex)),
this, SLOT(printChoice(QModelIndex)));
...
void MyClass::printChoice(QModelIndex index)
std::cout << ui->myList->model()->data(index).toString();
此代码完美运行。但是,我的项目负责人说,当用户单击 F2 键时,他们希望它为当前选择的列表中的任何行输入此插槽。我不知道为这些键发出的任何信号,并且环顾网络并没有太大帮助。有谁知道这样做的方法?谢谢!
编辑:我发现在选择值时点击 F2 会自动将该行置于编辑模式(它必须内置到 Qt 中)但我仍然需要知道如何触发发生这种情况时的插槽。
编辑 2:我越来越近了。我发现我可以在MyClass
中创建一个名为keyPressEvent(QKeyEvent *event)
的插槽,只要按下某些键(包括fX 键)就会注册。但是,我仍然无法找到一种方法来区分哪个键触发了它,以及如何确保它是 F2
【问题讨论】:
考虑使用QShortcut
。
【参考方案1】:
从基类QWidget
实现虚函数keyPressEvent
:
void YourWidget::keyPressEvent(QKeyEvent *event)
if( event->key() == Qt::Key_F2 )
emit F2isPressed(/* some signature */); // connected elsewhere
OP 注意:虽然对于我试图弄清楚的特定情况(按下 F2 键),这个答案并不完全正确,但它确实工作对于几乎所有将触发该功能的 other 键(例如其他 Fx 键等)。事实证明 F2 对于 Qt 来说是一个非常奇怪的案例,需要一些解决方法才能开始工作。想看原帖是怎么自己解决的和这个问题的发帖者,可以看聊天here。我将把这个答案标记为已接受,因为虽然它不适用于这种特殊情况,但它通常是这类问题的正确答案。
【讨论】:
怎么了?有什么问题吗? 我试过这个,我得到了奇怪的结果。它似乎适用于 大多数 键;例如,如果我使用event->key() == Qt::Key_F3
然后按 F3,它可以工作。但是,对于 F2,这似乎在第一次按下按钮时不起作用。如果当前选择了一行并且我使用上面的代码按 F2,它会将所选行置于编辑模式 而不 第一次触发插槽,然后如果我再次单击 F2 而不更改当前选择行,它第二次工作。你知道为什么会这样吗?
我猜 F2 的内置功能有一些干预(就像你在原帖中所说的那样)。如果要自定义 F2 的功能,必须断开连接(或重新实现)。
您是否知道我可以在哪里找到它以知道要断开连接?我能找到的唯一参考是在 Qt 论坛中,有人说在这里 (trolltech.com/developer/notes/changes/changes-3.3.8) 进行修复...但是链接不起作用:(
嗯..我也很感兴趣,但仍在寻找答案。如果您碰巧找到它(比我快),请回答您自己的问题,我会投票。【参考方案2】:
您可以使用QShortcut
调用插槽:
QShortcut * shortcut = new QShortcut(QKeySequence(Qt::Key_F2),this,SLOT(printChoice()));
shortcut->setAutoRepeat(false);
在插槽printChoice()
中,您可以打印所选行的内容。
【讨论】:
以上是关于Qt - 有没有办法在输入特定键时发出信号?的主要内容,如果未能解决你的问题,请参考以下文章