C++ QT OSX Qt::META+Qt::Key_Tab 快捷方式绑定

Posted

技术标签:

【中文标题】C++ QT OSX Qt::META+Qt::Key_Tab 快捷方式绑定【英文标题】:C++ QT OSX Qt::META+Qt::Key_Tab shortcut bind 【发布时间】:2013-12-20 01:39:36 【问题描述】:

我正在尝试在 QTabWidget 中绑定 Qt::META + Qt::Key_Tab 快捷方式来切换标签(就像它在 chrome 或许多其他应用程序中一样)。 我已经尝试了在谷歌中找到的每一个解决方案,但是这个快捷方式组合不起作用。

我试过了:

Qt::Key_Control + Qt::Key_Tab, Qt::Key_Meta + Qt::Key_Tab, QKeySequence(Qt::Key_Meta, Qt::Key_Tab), @9876543@31@(Qt::META, @9876) 这样的组合。李> QShortcut QAction 使用虚拟QWidget::event捕获密钥 使用虚拟QWidget::eventFilterinstallEventFilter 捕获密钥 所有相关的,如keyPressed 等。

QWidget::event/QWidget::eventFilter 捕获 Shift+TabAlt+Tab,但不捕获 Ctrl(META)+Tab。当我按下 Ctrl 时,我看到了 qDebug 输出,当我按下 Ctrl + Tab 时,没有任何反应。

有人可以解释一下 OSX 上 QT 中这个特殊的组合键有什么问题和特别之处吗?

不管是什么小部件,我已经创建了干净的 GUI 项目,其中没有其他小部件 - 仍然一样。

一些信息:

OSX 山狮 10.8.5 QT 5.2

顺便说一句,在 Qt Creator 中我也无法设置 Ctrl+Tab 快捷方式,真是可笑。

注意:它在 Windows 上运行良好,但在 OSX 上不起作用!

感谢您的帮助。

带有 QAction 的简单代码:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

    ui->setupUi(this);


    QAction *pAction = new QAction(this);
    QKeySequence keySequence = Qt::META + Qt::Key_Tab; // Not working
    // or
    QKeySequence keySequence = Qt::ALT + Qt::Key_Tab; // Works Alt+Tab
    // or
    QKeySequence keySequence = QKeySequence(Qt::Key_Meta, Qt::Key_Tab); // Not working
    // or
    QKeySequence keySequence = QKeySequence(Qt::META, Qt::Key_Tab); // Not working
    pAction->setShortcut(keySequence);

    connect(pAction, SIGNAL(triggered()), this, SLOT(shortcut_NextTab()));

    addAction(pAction);


及槽函数:

void MainWindow::shortcut_NextTab()

    qDebug() << "LOL";

当按下 Ctrl+Tab 时,期望在应用程序输出中看到 LOL

【问题讨论】:

请发布您尝试过的代码,解释您期望它做什么以及为什么它不起作用。 使用 QAction 添加了一段简单的代码。我可以根据需要更改 Qt::Key_Meta + Qt::Key_Tab 并且它可以工作,但是 Ctrl+Tab 不起作用。 【参考方案1】:

这似乎是 Qt on Cocoa 中的一个错误。请参阅 QTBUG-8596 和 QTBUG-12232。第一个错误报告有一个comment,它说如果您将 QAction 添加到菜单中它就可以工作。我遇到了和你一样的问题,这个解决方案对我有用。

【讨论】:

【参考方案2】:

在这一行:

QKeySequence keySequence = Qt::Key_Meta + Qt::Key_Tab;

您只是在添加整数。每QT documentation:

QKeySequence::QKeySequence (int k1, int k2 = 0, int k3 = 0, int k4 = 0) 构造一个包含最多 4 个键 k1、k2、k3 和 k4 的键序列。 键码列在 Qt::Key 中,可以与修饰符组合(参见 Qt::Modifier),例如 Qt::SHIFT、Qt::CTRL、Qt::ALT 或 Qt::META。

意思:

如果你想要一个序列,你需要对QKeySequence使用双参数构造函数,而不仅仅是将两个整数相加(这就是你正在做的)并使用单参数构造函数。 如果你想要一个修饰符 - 我假设这意味着按住一个键 - 使用 QT::Modifier,而不是 Qt::Key_*

【讨论】:

好的,感谢回复,但是 Qt::META + Qt::Key_Tab 不起作用。我可以添加一长串我尝试过的代码,但我认为不会有问题。 @x610 我知道它不起作用。这就是我刚刚告诉你的。你知道 C++ 中 = 的构造函数和初始化是如何工作的吗? @x610 无论如何我认为QKeySequence::QKeySequence(Qt::Key_Meta, Qt::Key_Tab) 是你想要的。 是的,我明白你在说什么,但即使使用 QKeySequence::QKeySequence(Qt::Key_Meta, Qt::Key_Tab) 也不起作用,并且 eventFilter 和 QWidget::event 不显示Ctrl+Tab 上的事件。 @x610 你可能还有其他错误,但我 99% 确定我的帖子是正确的,在这里使用 + 是错误的。

以上是关于C++ QT OSX Qt::META+Qt::Key_Tab 快捷方式绑定的主要内容,如果未能解决你的问题,请参考以下文章

Qt Meta Type System

Qt Meta Object System-元对象系统

Qt Meta Object system 学习

使用 Qt 在 OS X/Mac 上构建 C++ 库

qt按键 keypressevent

通过 Qt (mac - OSX) 的 AWS 查询没有得到任何结果