Qt注册热键QHotkey

要想在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"));
// Ctrl+P 之间不能有空格
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 过滤掉这些信息。

1
2
3
4
5
6
7
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) 注册热键

1
QHotkey *hotkey = new QHotkey{QKeySequence("Ctrl+P"),true};

2.提供Qt::Key和Qt::KeyboardModifiers,不过是通过setShortcut设置。如下

1
QHotkey *hotkey =new QHotkey(this);hotkey->setShortcut(Qt::Key_A,Qt::ControlModifier,true);

注册热键成功后就可以在槽函数QHotkey::activated中进行处理了

结尾

是不是很简单呢?


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!