如何在 Qt 中使用两个键修饰符设置 3 键序列快捷键?

Posted

技术标签:

【中文标题】如何在 Qt 中使用两个键修饰符设置 3 键序列快捷键?【英文标题】:How to set 3-key sequence shortcut with two key modifiers in Qt? 【发布时间】:2017-03-18 15:40:42 【问题描述】:

我一直在尝试将快捷方式设置为 Ctrl + Shift +C

我尝试了以下方法:

QAction *generalControlAction = new QAction(this);
generalControlAction->setShortcut(QKeySequence("Ctrl+Shift+c"));
connect(generalControlAction, &QAction::triggered, this, &iBexWorkstation::onGeneralConfiguration);

QShortcut *generalControlShortcut = new QShortcut(QKeySequence("Ctrl+Shift+C"), this);
connect(generalControlShortcut, &QShortcut::activated, this, &iBexWorkstation::onGeneralConfiguration);

他们没有工作。当我按下 Ctrl + Shift +C 时,什么都没有触发。

Qt中不能用两个修饰符设置快捷方式吗?

【问题讨论】:

【参考方案1】:

我写了一个最小的、完整的示例。在我的情况下,你描述它的方式是有效的。可能是,我添加了一些你没有在你身边的东西。 (这就是为什么“最少、完整、可验证的样本”是首选的原因。)

// standard C++ header:
#include <iostream>

// Qt header:
#include <QAction>
#include <QApplication>
#include <QLabel>
#include <QMainWindow>

using namespace std;

int main(int argc, char **argv)

  cout << QT_VERSION_STR << endl;
  // main application
#undef qApp // undef macro qApp out of the way
  QApplication qApp(argc, argv);
  // the short cut
  const char *shortCut = "Ctrl+Shift+Q";
  // setup GUI
  QMainWindow qWin;
  QAction qCmdCtrlShiftQ(&qWin);
  qCmdCtrlShiftQ.setShortcut(QKeySequence(shortCut));
  qWin.addAction(&qCmdCtrlShiftQ); // DON'T FORGET THIS.
  QLabel qLbl(
    QString::fromLatin1("Please, press ")
    + QString::fromLatin1(shortCut));
  qLbl.setAlignment(Qt::AlignCenter);
  qWin.setCentralWidget(&qLbl);
  qWin.show();
  // add signal handlers
  QObject::connect(&qCmdCtrlShiftQ, &QAction::triggered,
    [&qLbl, shortCut](bool) 
    qLbl.setText(
      QString::fromLatin1(shortCut)
      + QString::fromLatin1(" pressed."));
  );
  // run application
  return qApp.exec();

我怀疑你没有打电话给QWidget::addAction()。如果我将其注释掉,它在我的程序中也不再起作用。

在 Windows 10(64 位)上使用 VS2013 和 Qt 5.6 编译:

此快照是在按 Ctrl+Shift+Q 后制作的。

注意:

后来我意识到实际的问题是关于“Ctrl+Shift+C”。可以肯定的是,我检查了它。上面的示例代码也适用于“Ctrl+Shift+C”。

【讨论】:

当我们将快捷方式添加为操作时,它会起作用。通常的方法是行不通的。知道这一点很重要。【参考方案2】:

generalControlAction->setShortcut(QKeySequence(Ctrl+Shift+c));

只需将代码中的上述语句更改为

generalControlAction->setShortcut((Ctrl+Shift+C));

这应该可以正常工作。 "C" 后面应该大写。

请参考下面给定链接的按键顺序 http://doc.qt.io/qt-5/qkeysequence.html

【讨论】:

我已经尝试过 c 和 C。它对我的代码不起作用。我会尝试 Scheff 的回答并给出反馈。 @PatelKalpesh 我阅读了 Qt 文档。你链接了。声明:“请注意,对于字母,规范字符串中使用的大小写无关紧要。” 我在我的代码中添加了相同的行,它对我来说工作正常。这是我的代码中的行“action->setShortcut(tr("Ctrl+Shift+C"));”

以上是关于如何在 Qt 中使用两个键修饰符设置 3 键序列快捷键?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Qt::Key 转换为键盘键名?

XCTest - 如何使用 Command 和 Shift 创建多个键修饰符标志?

键绑定中的修饰符(SHIFT +(随机键))

在 Firefox 中更改 accesskey 修饰键

从热键中删除自动修饰符

使用 IOHIDManager 获取修饰符键事件