在Qt中响应应用程序范围的“热键”

时间:2010-12-03 00:42:58

标签: qt keyboard-shortcuts

我有一个简单的Qt应用程序,我只想回复 F12 键,无论哪个小部件都有焦点。

是否有一些简单的信号或我可以加入的东西?

我想使用 F12 键来打开/关闭主窗口全屏。

3 个答案:

答案 0 :(得分:27)

我没试过,但这就是我要做的事情:

创建QShortcut并确保其contextsetContext()}为Qt::ApplicationShortcut

shortcut = new QShortcut(QKeySequence(Qt::Key_F12), parent);
shortcut->setContext(Qt::ApplicationShortcut);

然后您只需要将一个插槽连接到QShortcut::activated()信号。

答案 1 :(得分:2)

如果您有一个"中央小部件"所有其他小部件都是子代的,那么你可以简单地将其设置为QShortcut的小部件参数。

(Python,qt5)

self.centralwidget = QtWidgets.QWidget(MainWindow)

QtWidgets.QShortcut(QtGui.QKeySequence("F12"), self.centralwidget, self.goFullScreen)

我添加了这个作为答案,因为快捷方式上下文标记:Qt.ApplicationShortcut对我不起作用。

答案 2 :(得分:0)

将快捷方式上下文设置为Qt::ApplicationShortcut有一个严重缺陷。在模式对话框中将不起作用。因此,如果您需要真正的泛应用程序范围的快捷方式,则需要重写应用程序的notify()方法。另一种方法是为应用程序对象安装事件过滤器,但是我怀疑它会比较慢,并且需要更多的代码。使用notify()非常简单:

class MyApplication : public QApplication
{
    // TODO: constructor etc.

protected:

bool MyApplication::notify(QObject *receiver, QEvent *event) override
{
    if (event->type() == QEvent::KeyPress)
    {
        auto keyEvent = static_cast<QKeyEvent*>(event);
        if (keyEvent->key() == Qt::Key_F12 && keyEvent->modifiers() == Qt::NoModifiers)
        {
            // TODO: do what you need to do
            return true;
        }  
    }
    return QApplication::notify(receiver, event);
}

}