要想在Qt支持全局注册热键,Windows下方法很简单RegisterHotKey函数可以满足。当然,这只能在Windows下操作,那么,是否有一个跨平台的全局注册热键库方便使用呢?
QHotkey
官网
Github
QHotkey类参考
PS: QHotkey适用于 Windows, Mac , X11
从github上获取源文件,自行编译(无需安装)
git clone https://github.com/Skycoder42/QHotkey.git
cd QHotkey
qmake
make
之后就可以使用了。使用方法如下
创建一个Qt项目,在 .pro 中添加
include(QHotkey/qhotkey.pri)
LIBS += -L$$PWD/QHotkey/QHotkey -lQHotkey
INCLUDEPATH += $$PWD/QHotkey/QHotkey
注意,我把 QHotkey 文件夹复制到项目目录下,并且要include qhotkey.pri
LIBS 和 INCLUDEPATH不能直接写成,否则出现 No such file or directory:
LIBS += -LQHotkey/QHotkey -lQHotkey
INCLUDEPATH += QHotkey/QHotkey
主要代码实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #include "QHotkey" bool ispressed=false; Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); QLoggingCategory::setFilterRules(QStringLiteral("QHotkey.warning=false")); QHotkey *hotkey = new QHotkey{QKeySequence("Ctrl+P"),true}; connect(hotkey, &QHotkey::activated, [this](){ if(ispressed==false){ ispressed=true; QMessageBox::information(this,"Hello","Hello"); ispressed=false; }else{ ispressed=true; return; } }); }
|
默认的,QHotkey会打印一些警告信息,不过可以用 QLoggingCategory::setFilterRules 过滤掉这些信息。
| QHotkey (QObject *parent=Q_NULLPTR) QHotkey (const QKeySequence &shortcut, bool autoRegister=false, QObject *parent=Q_NULLPTR) QHotkey (Qt::Key key, Qt::KeyboardModifiers modifiers, bool autoRegister=false, QObject *parent=Q_NULLPTR) QHotkey (const NativeShortcut &shortcut, bool autoRegister=false, QObject *parent=Q_NULLPTR) bool setRegistered (bool registered) bool setShortcut (const QKeySequence &shortcut, bool autoRegister=false) bool setShortcut (Qt::Key key, Qt::KeyboardModifiers modifiers, bool autoRegister=false)
|
有两种方法构造一个 QHotkey 对象:
1.提供一个 QKeySequence 对象,如果 QHotkey 构造函数第二个参数为 false,则必须调用 bool setRegistered (bool registered) 注册热键
| QHotkey *hotkey = new QHotkey{QKeySequence("Ctrl+P"),true};
|
2.提供Qt::Key和Qt::KeyboardModifiers,不过是通过setShortcut设置。如下
| QHotkey *hotkey =new QHotkey(this);hotkey->setShortcut(Qt::Key_A,Qt::ControlModifier,true);
|
注册热键成功后就可以在槽函数QHotkey::activated中进行处理了
结尾
是不是很简单呢?