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-&gt;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 - 有没有办法在输入特定键时发出信号?的主要内容,如果未能解决你的问题,请参考以下文章

QListView 悬停事件?

是否可以在 Qt3.0 中发出跨进程信号或发布触摸/鼠标单击事件?

Qt使用信号参数[重复]

Qt:更改QPointer时发出信号

html表单在特定输入上按Enter键时阻止提交[重复]

Qt没有发出信号