最近做一個項目需要注冊全局熱鍵,在網上搜索發現有個第三方庫 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