Qt5全局热键-QxtGlobalShortcut

最近做一个项目需要注册全局热键,在网上搜索发现有个第三方库 libqxt 中给出一个比较好的跨平台的解决方案,就是 QxtGlobalShortcut。

但是编译过程中发现这个库用到的QAbstractEventDispatcher::EventFilter在qt5.3.1中已经没了,所以我就自己改写了一下。

更改部分如下:

  在QxtGlobalShortcutPrivate类的前面添加如下代码,因为在qt5中需要用到QAbstractNativeEventFilter这个类

源文章地址http://www.cnblogs.com/AfterTheRainOfStars/p/3946313.html

  

1 #if(QT_VERSION>=0x050000)
2 #include <QAbstractNativeEventFilter>
3 #endif

然后将

class QxtGlobalShortcutPrivate : public QxtPrivate<QxtGlobalShortcut>

改为

1 class QxtGlobalShortcutPrivate : public QxtPrivate<QxtGlobalShortcut>
2 #if(QT_VERSION>=0x050000)
3         , public QAbstractNativeEventFilter
4 #endif

再将

1 static QAbstractEventDispatcher::EventFilter prevEventFilter;
2     static bool eventFilter(void* message);

修改为

1 #if(QT_VERSION<0x050000)
2     static QAbstractEventDispatcher::EventFilter prevEventFilter;
3     static bool eventFilter(void* message);
4 #else
5     bool nativeEventFilter(const QByteArray &eventType, void *message, long *result);
6 #endif

然后分别在qxtglobalshortcut_mac.cpp,qxtglobalshortcut_win.cpp,qxtglobalshortcut_x11.cpp中将

bool QxtGlobalShortcutPrivate::eventFilter(void* message)

函数的实现改为如下:

 1 #if(QT_VERSION<0x050000)
 2 bool QxtGlobalShortcutPrivate::eventFilter(void* message)
 3 {
 4     原本函数体内的代码;
 5 }
 6 #else
 7 bool QxtGlobalShortcutPrivate::nativeEventFilter(const QByteArray &, void *message, long *)
 8 {
 9   同  eventFilter函数内的代码
10 }
11 #endif

经过这样修改以后就能用在qt5.3.1上面了,而且不影响在原本的qt4上使用

代码下载地址:http://download.csdn.net/detail/zhangyspa/7842941

另外,关于QxtGlobalShortcut的使用方法可以参考这个博客

http://blog.csdn.net/dbzhang800/article/details/6302816

时间: 2024-10-11 05:55:54

Qt5全局热键-QxtGlobalShortcut的相关文章

Qt 5.x 全局热键 for windows

Qt 升级到5.x版本后,QAbstractEventDispatcher中函数发生变动,导致libqxt库中的qxtGlobalShortcut挂掉.参考qxtGlobalShortcut写了一个全局热键类,用法与qxtGlobalShortcut一致.在 Win8.1 + Qt 5.11 能正常使用 _______________________________________________________________________   用法 ____________________

QT全局热键(用nativeKeycode封装API,不跨平台)

在网上找了很长时间,大家都提到了一个QT全局热键库(qxtglobalshortcut),支持跨平台.在这篇文章中,我将只展示出windows平台下全局热键的设置. 这里提供的方法是在MyGlobalShortCut里面完成Windows的API封装,并在main.cpp中使用. 直接上代码: MyWinEventFilter类: class MyWinEventFilter :public QAbstractNativeEventFilter { public: MyWinEventFilte

;徐晓亮的跟随电脑启动的AutoHotkey全局热键和热字串脚本

/*;------------------------------------------------------------[重要提示]在SciTE或者EmEditor中按热键Ctrl+G -> 150 -> Enter跳转到热键定义处①立即升级杀毒软件病毒库②用pft.exe个人文件转移工具转移文件夹到非系统盘D:盘(pft.exe文件来自于一键Ghost硬盘版C:\dosh\ghos\pft.exe)③通过Total Commander的工具栏来正确的新建和打开文件和文件夹(养成只在36

Qt全局热键(windows篇)(使用RegisterHotKey和句柄进行注册)

转载:http://www.cuteqt.com/blog/?p=2088 Qt对于系统底层,一直没有很好的支持,例如串口并口通信,还有我们经常都会用到的全局热键,等等.既然Qt可能出于某种原因,不对这些进行支持,我们就只能自己写代码,调用系统相关的API了. 注意,这个是Windows篇,就说明这些代码只支持windows系统.同时,也说明肯定还有其他平台的要写.不过要等O(∩_∩)O~ 在Qt要调用Windows的API其实很简单,只要在需要用到的头文件中添加#include <window

Qt全局热键(windows篇)

Qt对于系统底层,一直没有很好的支持,例如串口并口通信,还有我们经常都会用到的全局热键,等等.既然Qt可能出于某种原因,不对这些进行支持,我们就只能自己写代码,调用系统相关的API了. 注意,这个是Windows篇,就说明这些代码只支持windows系统.同时,也说明肯定还有其他平台的要写.不过要等O(∩_∩)O~ 在Qt要调用Windows的API其实很简单,只要在需要用到的头文件中添加#include <windows.h>即可.不过要注意,Qt仅支持win32的API,像MFC之类的是不

C# 全局热键设置 与 窗体热键设置

1. 窗体热键 首先要设置主窗体KeyPreview为true,可直接在属性中进行设置, 或者在窗体加载中设置: this.KeyPreview = true; 然后添加窗体KeyDown事件,如下: private void FrmMain_KeyDown(object sender, KeyEventArgs e) { if (e.Alt && e.Shift && e.Control && e.KeyCode == Keys.S) { MessageB

Java设置全局热键——第三方包jintellitype实现

Java原生API并不支持为应用程序设置全局热键.要实现全局热键,需要用JNI方式实现,这就涉及到编写C/C++代码,这对于大多数不熟悉C/C++的javaer来说,有点困难.不过幸好,国外有人已经实现了,发布成第三方java包,借此,我们可以很方便的设置全局热键而不用编写任何C/C++代码. jintellitype官网貌似目前访问不到,这里提供下载:http://pan.baidu.com/s/1kTIDxgN. 我实现的演示Demo源码下载:http://pan.baidu.com/s/1

全局热键

Demo下载:https://git.oschina.net/xieyimo9/quanjurejian.git 主要代码: procedure TForm1.HotKey(var msg: TMessage); begin if msg.WParam =FHotKeyId_Alt_Down then Memo1.Lines.Add('Alt Down') else if msg.WParam =FHotKeyId_Alt_Up then Memo1.Lines.Add('Alt Up') el

使用WinAPI全局热键注册和全局模拟按键

一.全局热键注册 1.先引用DLL [System.Runtime.InteropServices.DllImport("user32.dll")] //导入WinAPI public static extern bool RegisterHotKey( //设置热键 IntPtr hWnd, // 窗口句柄,一般使用Handle属性 int id, // 区别热键的ID号,这个可以随便写,只是用来区分不同热键 uint fsModifiers, // 修正键用户接下哪些键是发生 可能