3.QT事件处理,消息过滤器
2014-12-12 19:39
417 查看
1
新建一个项目:06Event
新建cpp文件
2
QT消息过滤器
1
新建一个项目:06Event
新建cpp文件
06Event.pro |
HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += widgetsgui |
MyWidget.h |
#ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include <QPushButton> #include <QLineEdit> class MyWidget : public QWidget { Q_OBJECT public: explicit MyWidget(QWidget *parent =0); bool event(QEvent *); void mousePressEvent(QMouseEvent *); void mouseReleaseEvent(QMouseEvent *); void mouseMoveEvent(QMouseEvent *); /*不要用,因为它默认调用两次mousePressEvent*/ //void mouseDoubleClickEvent(QMouseEvent *); void keyPressEvent(QKeyEvent *); void keyReleaseEvent(QKeyEvent *); void closeEvent(QCloseEvent *); //void showEvent(QShowEvent *); //void hideEvent(QHideEvent *); void paintEvent(QPaintEvent *); QPushButton* button; QLineEdit* edit; signals: public slots: void slotButtonClicked(); }; #endif // MYWIDGET_H |
MyWidget.cpp |
#include"MyWidget.h" #include<QApplication> #include<QEvent> #include<QDebug> #include<QMouseEvent> #include<QKeyEvent> #include<QVBoxLayout> #include<QPainter> MyWidget::MyWidget(QWidget*parent): QWidget(parent) { //QVBoxLayout*lay=newQVBoxLayout(this); #if0 QPushButton*button2; lay->addWidget(button=newQPushButton("OK",this)); lay->addWidget(button2=newQPushButton("Button2")); //设置它为默认的焦点,当点击tab键之后可以切换焦点 button->setDefault(true); //鼠标不需要按下,mouseMove就能得到调用 this->setMouseTracking(true); connect(button2,SIGNAL(clicked()),this,SLOT(slotButtonClicked())); connect(button,SIGNAL(clicked()),this,SLOT(slotButtonClicked())); #endif //lay->addWidget(edit=newQLineEdit()); //connect(edit,SIGNAL(returnPressed()),this,SLOT(slotButtonClicked())); } //通过这一句实现点击按钮的时候获得按钮上的text()内容 voidMyWidget::slotButtonClicked() { QLineEdit*button=(QLineEdit*)sender(); qDebug()<<button->text(); } /*QApplication先得到->具体应该处理的窗口::event()->event()根据消息类型来调用具体的虚函数*/ /*1)可以重载具体的虚函数,来实现对消息的响应 2)可以重载event函数,用来处理或者截取消息*/ /*截取消息*/ boolMyWidget::event(QEvent*ev) { //鼠标消息被截断 //if(ev->type()==QEvent::MouseButtonPress) //returntrue; ev->accept(); returnQWidget::event(ev); } /** *@briefMyWidget::closeEvent窗口关闭的事件 */ voidMyWidget::closeEvent(QCloseEvent*) { qDebug()<<"closeEvent"; } voidMyWidget::paintEvent(QPaintEvent*) { QPainterp(this); //通过下面的方式实现画线 p.drawLine(QPoint(0,0),QPoint(100,100)); } /** *@briefMyWidget::mousePressEvent鼠标按下的事件 *@paramev */ voidMyWidget::mousePressEvent(QMouseEvent*ev) { #if0 QPointpt=ev->pos(); qDebug()<<pt; //如果鼠标按下的是左键的处理 if(ev->button()==Qt::LeftButton){} //如果按下的Shift键了 if(ev->modifiers()==Qt::ShiftModifier) { qDebug()<<"shiftpress"; } #endif //改进办法:先判断是否有左键,然后如果判断是否还按了Ctrl键 if(ev->button()==Qt::LeftButton) { if(ev->modifiers()==Qt::ControlModifier) { //handlewithControl; return; } //handle2withoutcontrol; }else{} } /** *@briefMyWidget::mouseReleaseEvent鼠标释放的按键 */ voidMyWidget::mouseReleaseEvent(QMouseEvent*){} /** *@briefMyWidget::mouseMoveEvent鼠标移动的事件 */ voidMyWidget::mouseMoveEvent(QMouseEvent*) { staticinti=0; qDebug()<<"mousemove"<<i++; } /** *@briefMyWidget::keyPressEvent鼠标按下的事件,通过这个可以获得按下的键 *@paramev */ voidMyWidget::keyPressEvent(QKeyEvent*ev) { ev->modifiers(); intkey=ev->key(); qDebug()<<key; chara=key; qDebug()<<(char)a; } /** *@briefMyWidget::keyReleaseEvent按键释放的事件 */ voidMyWidget::keyReleaseEvent(QKeyEvent*){} intmain(intargc,char*argv[]) { QApplicationapp(argc,argv); MyWidgetw; w.show(); returnapp.exec(); } |
运行结果: |
QT消息过滤器
EventFilter.pro |
HEADERS += \ MyWidget.h \ MyApplication.h SOURCES += \ MyWidget.cpp \ MyApplication.cpp QT += widgetsgui |
MyWidget.h |
#ifndefMYWIDGET_H #defineMYWIDGET_H #include<QWidget> #include<QPushButton> classMyWidget:publicQWidget { Q_OBJECT public: explicitMyWidget(QWidget*parent=0); QPushButton*_button; booleventFilter(QObject*,QEvent*); boolevent(QEvent*); signals: publicslots: }; #endif//MYWIDGET_H |
MyWidget.cpp |
#include"MyWidget.h" #include<QPushButton> #include<QEvent> #include"MyApplication.h" #include<QDebug> #include<QApplication> MyWidget::MyWidget(QWidget*parent): QWidget(parent) { QPushButton*button; button=newQPushButton("Thisbutton",this); connect(button,SIGNAL(clicked()),this,SLOT(close())); _button=button; /*button给自己安装了一个消息过滤器,那么经过button的消息, *都先要调用它的过滤器的eventFilter函数*/ button->installEventFilter(this); } boolMyWidget::eventFilter(QObject*o,QEvent*e) { #if0 if(0==(QObject*)_button&&( e->type()==QEvent::MouseButtonRelease|| e->type()==QEvent::MouseButtonDblClick|| e->type()==QEvent::MouseButtonPress)){ returntrue; } #endif returnQWidget::eventFilter(o,e); } boolMyWidget::event(QEvent*e) { if(e->type()==QEvent::User) { qDebug()<<"Usereventiscomming"; } returnQWidget::event(e); } intmain(intargc,char*argv[]) { MyApplicationapp(argc,argv); MyWidgetw; w.show(); //发送一个Event给MyWidget qDebug()<<"beginsend"; app.postEvent(&w,newQEvent(QEvent::User)); qDebug()<<"endsend"; returnapp.exec(); } |
MyApplication.h |
#ifndefMYAPPLICATION_H #defineMYAPPLICATION_H #include<QApplication> classMyApplication:publicQApplication { Q_OBJECT public: MyApplication(intargc,char*argv[]):QApplication(argc,argv) {} boolnotify(QObject*,QEvent*); signals: publicslots: }; #endif//MYAPPLICATION_H |
MyApplication.cpp |
#include"MyApplication.h" #include<QEvent> #include<QDebug> boolMyApplication::notify(QObject*o,QEvent*e) { if(this->topLevelWidgets().count()>0) { QWidget*mainWnd=this->topLevelWidgets().at(0); if(o==(QObject*)mainWnd&&e->type()==QEvent::MouseButtonPress) { //do... qDebug()<<"mainwndisclicked"; } } returnQApplication::notify(o,e); } |
运行结果: |
相关文章推荐
- 3.QT事件处理,消息过滤器
- Qt之事件过滤器 截获消息通知 自定义消息处理事件解析.
- 利用异常进行系统中通用的消息通知和事件处理
- 通过消息拦截达到在Delphi控件中屏蔽原有事件处理的一种方法
- 处理控制台事件消息
- Go语言Windows程序设计(4)--处理子窗体消息之按钮点击事件
- QT类 Qevent事件处理过程 事件过滤器
- QT类 Qevent事件处理过程 事件过滤器
- unity3d事件函数整理,事件,回调函数,消息处理
- SAP BTE和消息(事件处理)
- 如何处理被拦截的键盘消息事件
- CListCtrl控件主要事件及LVN_ITEMCHANGED消息和鼠标双击列表项事件的处理
- usb 视频设备 按钮消息处理 和普通usb连接的事件处理
- 利用勾子监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理
- 注册 创建 显示 刷新窗口(注建显新),事件,消息循环,消息处理,钩子,dll钩子. (注重理解其中的逻辑关系)
- CListCtrl控件主要事件及LVN_ITEMCHANGED消息和鼠标双击列表项事件的处理
- 控制台如何像windows程序那样处理消息事件
- CListCtrl控件主要事件及LVN_ITEMCHANGED消息和鼠标双击列表项事件的处理
- C#中在窗体间使用消息来处理相关联的事件
- iphone 消息处理事件 postNotificationName和addObserver的调用