[Qt6][QML][教程]全局热键的实现

模仿网易云切歌时候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

然后大功告成!

参考:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值