3.QT事件处理,消息过滤器
1
新建一个项目:06Event
新建cpp文件
|
06Event.pro |
|
HEADERS MyWidget.h SOURCES MyWidget.cpp QT |
|
MyWidget.h |
|
#ifndef #define #include #include #include class { Q_OBJECT public: explicit bool void void void /*不要用,因为它默认调用两次mousePressEvent*/ //void void void void //void //void void QPushButton* QLineEdit* signals: public void }; #endif |
|
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 = new QVBoxLayout(this); #if 0 QPushButton* button2; lay->addWidget(button = new QPushButton("OK", this));
lay->addWidget(button2 = new QPushButton("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 = new QLineEdit()); // connect(edit, SIGNAL(returnPressed()), this, SLOT(slotButtonClicked())); } //通过这一句实现点击按钮的时候获得按钮上的text()内容 void MyWidget::slotButtonClicked() {
QLineEdit* button = (QLineEdit*)sender(); qDebug() << button->text(); } /* QApplication先得到->具体应该处理的窗口::event()->event()根据消息类型来调用具体的虚函数 */ /* 1)可以重载具体的虚函数,来实现对消息的响应 2)可以重载event函数,用来处理或者截取消息 */ /* 截取消息 */ bool MyWidget::event(QEvent *ev) {
// 鼠标消息被截断 // if(ev->type() == QEvent::MouseButtonPress) // return true; ev->accept(); return QWidget::event(ev); } /** * @brief MyWidget::closeEvent 窗口关闭的事件 */ void MyWidget::closeEvent(QCloseEvent *) {
qDebug() << "closeEvent"; } void MyWidget::paintEvent(QPaintEvent *) {
QPainter p(this); //通过下面的方式实现画线 p.drawLine(QPoint(0, 0), QPoint(100, 100)); } /** * @brief MyWidget::mousePressEvent 鼠标按下的事件 * @param ev */ void MyWidget::mousePressEvent(QMouseEvent *ev) {
#if 0 QPoint pt = ev->pos(); qDebug() << pt; //如果鼠标按下的是左键的处理 if(ev->button() == Qt::LeftButton){}
//如果按下的Shift键了 if(ev->modifiers() == Qt::ShiftModifier) {
qDebug() << "shift press"; } #endif //改进办法:先判断是否有左键,然后如果判断是否还按了Ctrl键 if(ev->button() == Qt::LeftButton) {
if(ev->modifiers() == Qt::ControlModifier) {
// handle with Control; return; } // handle2 without control; } else {}
} /** * @brief MyWidget::mouseReleaseEvent 鼠标释放的按键 */ void MyWidget::mouseReleaseEvent(QMouseEvent *){}
/** * @brief MyWidget::mouseMoveEvent 鼠标移动的事件 */ void MyWidget::mouseMoveEvent(QMouseEvent *) {
static int i=0; qDebug() << "mouse move"<< i++; } /** * @brief MyWidget::keyPressEvent 鼠标按下的事件,通过这个可以获得按下的键 * @param ev */ void MyWidget::keyPressEvent(QKeyEvent *ev) {
ev->modifiers(); int key = ev->key(); qDebug() << key; char a = key; qDebug() << (char)a; } /** * @brief MyWidget::keyReleaseEvent 按键释放的事件 */ void MyWidget::keyReleaseEvent(QKeyEvent *){}
int main(int argc, char* argv[]) {
QApplication app(argc, argv); MyWidget w; w.show(); return app.exec(); } |
运行结果: |
2
QT消息过滤器
|
EventFilter.pro |
|
HEADERS MyWidget.h MyApplication.h SOURCES MyWidget.cpp MyApplication.cpp QT |
|
MyWidget.h |
#ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include <QPushButton> class MyWidget : public QWidget {
Q_OBJECT public: explicit MyWidget(QWidget *parent); QPushButton* _button; bool eventFilter(QObject *, QEvent *); bool event(QEvent *); signals: public slots: }; #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 = new QPushButton("This button", this);
connect(button, SIGNAL(clicked()), this, SLOT(close())); _button = button; /*button给自己安装了一个消息过滤器,那么经过button的消息, * 都先要调用它的过滤器的eventFilter函数*/ button->installEventFilter(this); } bool MyWidget::eventFilter(QObject *o, QEvent *e) {
#if 0 if(0 == (QObject*)_button &&( e->type() == QEvent::MouseButtonRelease || e->type() == QEvent::MouseButtonDblClick || e->type() == QEvent::MouseButtonPress)) {
return true; } #endif return QWidget::eventFilter(o,e); } bool MyWidget::event(QEvent *e) {
if(e->type() == QEvent::User) {
qDebug() << "User event is comming"; } return QWidget::event(e); } int main(int argc,char *argv[]) {
MyApplication app(argc,argv); MyWidget w; w.show(); //发送一个Event给MyWidget qDebug() << "begin send"; app.postEvent(&w,new QEvent(QEvent::User)); qDebug() << "end send"; return app.exec(); } |
|
MyApplication.h |
#ifndef MYAPPLICATION_H #define MYAPPLICATION_H #include <QApplication> class MyApplication : public QApplication {
Q_OBJECT public: MyApplication(int argc,char *argv[]):QApplication(argc,argv) {}
bool notify(QObject *,QEvent *); signals: public slots: }; #endif // MYAPPLICATION_H |
|
MyApplication.cpp |
#include "MyApplication.h" #include <QEvent> #include <QDebug> bool MyApplication::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() << "mainwnd is clicked"; } } return QApplication::notify(o, e); } |
|
运行结果: |
3.QT事件处理,消息过滤器的更多相关文章
- Qt事件处理机制
研一的时候开始使用Qt,感觉用Qt开发图形界面比MFC的一套框架来方便的多.后来由于项目的需要,也没有再接触Qt了.现在要重新拾起来,于是要从基础学起. Now,开始学习Qt事件处理机制. 先给出原文 ...
- 【转】Qt 事件处理机制 (下篇)
转自:http://mobile.51cto.com/symbian-272816.htm 在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent. 接下来依次谈谈Qt中有谁来产生.分 ...
- 9、Qt 事件处理机制
原文地址:http://mobile.51cto.com/symbian-272812.htm 在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent. 接下来依次谈谈Qt中有谁来产生 ...
- Qt 事件处理机制
Qt 事件处理机制 因为这篇文章写得特别好,将Qt的事件处理机制能够阐述的清晰有条理,并且便于学习.于是就装载过来了(本文做了排版,并删减了一些冗余的东西,希望原主勿怪),以供学习之用. 简介 在Qt ...
- QT开发(十二)——QT事件处理机制
一.QT事件简介 QT程序是事件驱动的, 程序的每个动作都是由内部某个事件所触发.QT事件的发生和处理成为程序运行的主线,存在于程序整个生命周期. 常见的QT事件类型如下: 键盘事件: 按键按下和松开 ...
- Qt 事件处理机制 (下篇)
继续我们上一篇文章继续介绍,Qt 事件处理机制 (上篇) 介绍了Qt框架的事件处理机制:事件的产生.分发.接受和处理,并以视窗系统鼠标点击QWidget为例,对代码进行了剖析,向大家分析了Qt框架如何 ...
- 【转】解读Qt 事件处理机制(上篇)
[转自]:http://mobile.51cto.com/symbian-272812.htm 在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent. 接下来依次谈谈Qt中有谁来产生 ...
- Qt5学习笔记(消息过滤器)
T06EventFilter.pro HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += widgets gui MyWidget.h #i ...
- Qt 事件处理机制 (上篇)
本篇来介绍Qt 事件处理机制 .深入了解事件处理系统对于每个学习Qt人来说非常重要,可以说,Qt是以事件驱动的UI工具集. 大家熟知Signals/Slots在多线程的实现也依赖于Qt的事件处理机制. ...
随机推荐
- 【BZOJ2242】【SDOI2011】计算器
Description 你被要求设计一个计算器完成以下三项任务: 1.给定y.z.p,计算y^z mod p 的值: 2.给定y.z.p,计算满足xy ≡z(mod p)的最小非负整数x: 3.给定y ...
- 51nod1295 XOR key(可持久化trie)
1295 XOR key题目来源: HackerRank基准时间限制:1.5 秒 空间限制:262144 KB 分值: 160 难度:6级算法题 给出一个长度为N的正整数数组A,再给出Q个查询,每个查 ...
- [ZJOI2006]物流运输 SPFA+DP
题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪. ...
- poj1741Tree 点分治
上午学习了点分治,写了1个半小时终于写出一个代码--poj1741,可以说是个模板题. 分治:对于每个儿子找出重心,分别处理 注意:1.每次处理一个重心后,ans减去对它儿子的处理 原因:因为统计方法 ...
- 为什么Unix只允许对非目录文件实行勾链?
Unix文件系统的目录结构中带有交叉勾链,用户可以用不同的文件路径名共享一个文件,即文件的勾链在用户看来是为了一个已存在的文件另起一个路径名.在Unix的多级目录结构中勾链的结果表现为一个文件由多个目 ...
- 如何用Netty实现一个轻量级的HTTP代理服务器
为什么会想通过Netty构建一个HTTP代理服务器?这也是笔者发表这篇文章的目的所在. 其主要还是源于解决在日常开发测试过程中,一直困扰测试同学很久的一个问题,现在我就来具体阐述一下这个问题. 在日常 ...
- 利用maven install jar到项目当中
接着上面利用maven打好的jar包.把刚刚打好的包放入其他项目当中怎么办? 只需要在相同的目录下执行mvn install,maven会自动把jar放到本地仓库中. 这样,原先maven项目中缺少依 ...
- JAVAEE——BOS物流项目10:权限概述、常见的权限控制方式、apache shiro框架简介、基于shiro框架进行认证操作
1 学习计划 1.演示权限demo 2.权限概述 n 认证 n 授权 3.常见的权限控制方式 n url拦截权限控制 n 方法注解权限控制 4.创建权限数据模型 n 权限表 n 角色表 n 用户表 n ...
- django.db.utils.ProgrammingError: 1146 的解决办法
在models中设置完数据库相关的东西后执行命令 python manage.py makemigrations 此处无错误 再次执行 python manage.py migrate 发生报错 错误 ...
- jQuery – AJAX get() 和 post() 方法
jQuery get() 和 post() 方法用于通过 HTTP GET 或 POST 请求从服务器请求数据. HTTP 请求:GET vs. POST 两种在客户端和服务器端进行请求-响应的常用方 ...