模仿网易云切歌时候MAC的通知界面,需要用到快捷键弹窗的功能。
教程被应用在MediaStateT中
MediaStateT Github项目地址: https://github.com/taxue-alfred/MediaStateT
MediaStateT Gitee项目地址: https://gitee.com/MediaState/MediaStateT
问题引出
网上查了查找了找关于QML的全局热键相关,发现有叫Shortcut和Action的控件,但是我写到QML里面以后根本没有效果,前者还有一个叫Qt.ApplicationShortcut
属性,试了之后也无果。后者的Focus方案也无果。。
所以看了看官方的API:
官方说要求必须有一个活动的窗口。。
然而我实现的窗口是这样的:
这个窗口效果我之前写过一个博客: [Qt6][QML][教程]QML创建带图片的物理弹跳-快速隐藏效果的弹窗
这个窗口被隐藏了,没有可以活动的窗口,没效果也正常。。。
利用C++解决办法
那既然我们没有办法通过QML去实现,那么我们换一种思路,用C++实现然后发送信号给QML不就Ok了?既然目标明确,那就开搞。网上找了找发现了一个叫Qhotkey的东西。
还有就是可以调用WindowsAPI 的
RegisterHotKey
函数Qhotkey是一个跨平台的全局热键库,,里面在Windows平台的实现就是通过
RegisterHotKey
函数去实现的.我在代码里标注出来了:Qhotkey
以下为具体的实例:
//Class.h
signal:
void hot_key_activated(int value);
public slots:
void hot_key_call();
//Class.cpp
QHotkey * hotkey1 = new QHotkey(QKeySequence("Ctrl+1"), true);
//和槽函数连接
QObject::connect(hotkey1, &QHotkey::activated, this, &YourClass::hot_key_call_1);
槽函数实现:
//Class.cpp
void MT_info_get::hot_key_call_1() {
emit hot_key_activated(1);
QML端就直接注册类导入后相应信号然后调用窗口出现的函数就可以:
QML怎么注册C++的类这里不再赘述,自行查阅
//project.qml
onHot_key_activated:
//Qt6需要这么去写,qt5不需要加function()
function(value){
if(value == 1){
pop_window.showWindow()
}
}
PS:由于我使用的是Clion的Qt开发环境,Clion使用camke编译文件因此我们需要在CmakeLists.txt
添加需要编译的cpp文件和导入Qhotkey的头文件
其实官方有提供Cmake的编译指令,但是我编译之后多次出错,所以直接把源文件加到我项目的
CmakeLists.txt
了。使用qmake的同学直接按照官方的教程导入pri文件就好
// 添加头文件
include_directories("Libraries/QHotkey/QHotkey")
//添加cpp文件进行编译
add_executable(MediaStateT
Libraries/QHotkey/QHotkey/qhotkey.cpp
Libraries/QHotkey/QHotkey/qhotkey_win.cpp)
这里如果在其他平台使用camke则需要进行修改:
macos:将
qhotkey_win.cpp
更换为qhotkey_mac.cpp
Linux:将
qhotkey_win.cpp
更换为qhotkey_x11.cpp
然后大功告成!
参考: