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::eventFilter
和installEventFilter
捕获密钥
所有相关的,如keyPressed
等。
QWidget::event
/QWidget::eventFilter
捕获 Shift+Tab、Alt+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 快捷方式绑定的主要内容,如果未能解决你的问题,请参考以下文章