QT中监控全局键盘鼠标事件
2015-09-17 14:09
676 查看
先介绍一下在单一Widget等控件中监听鼠标键盘事件的代码:
以上这些函数加在某一控件里,那么只有焦点在那一控件上的时候,才会响应这些函数来实现相关功能。
但很多情况下,我们需要监控全局下的键盘快捷键,无论焦点在哪个界面上。那么就需要重载QApplication类。
QApplication类一般放在main函数里,新键QT工程时会自动创建这些代码:
现在我们新建一个类GlobalApplication,继承QApplication,并重载notify函数,示例如下:
GlobalApplication.h
GlobalApplication.cpp
然后将main函数里的
Application a(argc, argv);
换成:
GlobalApplication a(argc, argv);
这样在任何界面点击鼠标或按下键盘,都会能响应到,再将具体功能实现到某单一界面上。
[code]void mouseMoveEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); void keyPressEvent(QKeyEvent *event); void Sale::keyPressEvent(QKeyEvent *event) { switch(event->key()) { case Qt::Key_Down: { } break; case Qt::Key_F1: { QDBG <<"ssss"; } } }
以上这些函数加在某一控件里,那么只有焦点在那一控件上的时候,才会响应这些函数来实现相关功能。
但很多情况下,我们需要监控全局下的键盘快捷键,无论焦点在哪个界面上。那么就需要重载QApplication类。
QApplication类一般放在main函数里,新键QT工程时会自动创建这些代码:
[code]int main(int argc, char *argv[]) { Application a(argc, argv); .... return a.exec(); }
现在我们新建一个类GlobalApplication,继承QApplication,并重载notify函数,示例如下:
GlobalApplication.h
[code]#define QDBG qDebug()<<__FILE__<<__FUNCTION__<<__LINE__ class GlobalApplication : public QApplication { public: GlobalApplication(int&argc,char **argv); ~GlobalApplication(); bool notify(QObject*, QEvent *); void setWindowInstance(QWidget*wnd); private: QWidget *widget; };
GlobalApplication.cpp
[code]#include "GlobalApplication.h" GlobalApplication::GlobalApplication(int &argc,char **argv): QApplication(argc,argv) { } GlobalApplication::~GlobalApplication() { } void GlobalApplication::setWindowInstance(QWidget *wnd) { widget = wnd; } bool GlobalApplication::notify(QObject *obj, QEvent *e) { const QMetaObject* objMeta = obj->metaObject(); QString clName = objMeta->className(); if(e->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast<QKeyEvent *>(e); if(keyEvent->key() == Qt::Key_F1) { QDBG<< clName; QDBG << "F1"; } // widget->keyPress(keyEvent); } else if(e->type() == QEvent::MouseButtonPress) { QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(e); if(mouseEvent->buttons() == Qt::LeftButton) QDBG << "left"; } return QApplication::notify(obj,e); }
然后将main函数里的
Application a(argc, argv);
换成:
GlobalApplication a(argc, argv);
这样在任何界面点击鼠标或按下键盘,都会能响应到,再将具体功能实现到某单一界面上。
相关文章推荐
- 如何在Qt QML应用中开启cache使得应用更加快捷
- Qt 学习之路:绘制设备
- Qt 学习之路:坐标系统
- PyQt4+win732bit
- Qt窗体之间相互传值的三种方式
- Qt制作高亮语法编辑器
- Qt项视图类
- QT在windows下的NSIS打包使用方法
- Qt 学习之路 :坐标系统
- qt文件操作
- Qt开源软件集锦(部分有编译指导)
- Qt 学习之路:自定义事件
- Qt 学习之路:深入 Qt5 信号槽新语法
- QTP脚本不能录制解决办法
- 彻底卸载QTP11.5方法
- 破解QTP11.5 方法
- 认识QTP自动化测试工具
- Ubuntu下Qt安装全过程解答
- QTP自动化测试框(转自小强老师博客)
- Qt 学习之路 :信号槽