文档章节

QT5: event()事件分配.

SHIHUAMarryMe
 SHIHUAMarryMe
发布于 2016/04/04 12:36
字数 551
阅读 88
收藏 1

好吧,事件分配是我自己给它起的名字.

当事件对象创建完毕后并不是立即被执行了,QT会将这个事件对象传递给首先传递给QObject的event()函数,

event()函数并不直接处理事件而是按照事件的类型来分配给不同的事件处理器.(比如:mousePressEvent(QMouseEvent* ev)).如果该函数返回true那么表明该事件已经被处理过了.对于其他我们不关心的事件,我们则是直接调用父类的event()函数再次进行分配.

如标题所说,event()就是用来分发事件的,因此如果希望在事件分发之前做一些事情那么就需要重写子类中的该函数.

说了那么多来让我们看个例子吧:

 
#include <QWidget>
#include <QEvent>
#include <QKeyEvent>
#include <QDebug>
class CustomWidget : public QWidget
{
    Q_OBJECT
public:
    CustomWidget(QWidget* parent = nullptr);
    ~CustomWidget()=default;
    virtual bool event(QEvent* ev)override;
protected:
    virtual void mousePressEvent(QMouseEvent* ev)override;
    virtual void keyPressEvent(QKeyEvent* ev)override;
private slots:
    //void onClicked()const noexcept;
};

 

 #include "mainwindow.h"
CustomWidget::CustomWidget(QWidget* parent)
             :QWidget(parent)
{
    this->setMinimumSize(500, 400);
}
bool CustomWidget::event(QEvent* ev)
{
    if(ev->type() == QEvent::MouseButtonPress){
        QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(ev);
        if(mouseEvent->buttons() == Qt::LeftButton){
            qDebug()<<"You press LeftButton by Mouse";
            return true; //返回true表明该事件已经被识别且已经被处理了.
        }
    }
    return this->QWidget::event(ev); //如果没被处理那么交给基类分配.
}
void CustomWidget::mousePressEvent(QMouseEvent* ev)
{
    qDebug()<<"mouse pressed!";
}
void CustomWidget::keyPressEvent(QKeyEvent* ev)
{
    qDebug()<<"key pressed!";
}

当我们点击CustomWidget的时候显示的是:

You press LeftButton by Mouse

你没有看错!mousePressEvent()没有被调用!!!

那我们来修改一下吧:

 bool CustomWidget::event(QEvent* ev)
{
    if(ev->type() == QEvent::MouseButtonPress){
        QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(ev);
        if(mouseEvent->buttons() == Qt::LeftButton){
            qDebug()<<"You press LeftButton by Mouse";
            this->mousePressEvent(mouseEvent); //注意这里!!!!!!!!!!!!!!
            return true; //返回true表明该事件已经被识别且已经被处理了.
        }
    }
    return this->QWidget::event(ev); //如果没被处理那么交给基类分配.
}

我们在其中加入了mousePressEvent()函数再看运行后的结果:

You press LeftButton by Mouse
mouse pressed!

正常了!!!!!!!!!!!!

我们来看一下QObject中event()的实现吧:

//!!! Qt5
bool QObject::event(QEvent *e)
{
    switch (e->type()) {
    case QEvent::Timer:
        timerEvent((QTimerEvent*)e);
        break;
 
    case QEvent::ChildAdded:
    case QEvent::ChildPolished:
    case QEvent::ChildRemoved:
        childEvent((QChildEvent*)e);
        break;
    // ...
    default:
        if (e->type() >= QEvent::User) {
            customEvent(e);
            break;
        }
        return false;
    }
    return true;
}

© 著作权归作者所有

上一篇: QT5: 事件过滤.
SHIHUAMarryMe
粉丝 13
博文 162
码字总数 138435
作品 0
武汉
程序员
私信 提问
加载中

评论(2)

SHIHUAMarryMe
SHIHUAMarryMe 博主

引用来自“榕树下_”的评论

哈哈本来还以为用qt的不多了呢,
哈哈哈哈哈,方便啊感觉也熟悉都是cpp
榕树下_
榕树下_
哈哈本来还以为用qt的不多了呢,
QT5: 事件过滤.

虽然可以用event拦截事件,但是有的时候我们的应用中用到了很多的组件,或者我们自己实现了一个组件继承了很多其他的组件,我们要想通过event拦截事件,就变得很困难了,必须重写所有的event...

SHIHUAMarryMe
2016/04/04
42
0
从QWindow到QWidget(Qt5)

Qt5下,QWidget系列从QtGui中被剥离出去,成为单独的QtWidget模块。随着Qt Quick2的引入,QtDeclarative也逐渐和QWidget系列也脱离关系。 最终:在Qt5下的GUI编程,有两套不同的东西 QtWidg...

晨曦之光
2012/05/08
3K
0
Qt5 与 Qt4 的点点差异------事件

Qt5相对于Qt4 增加对事件accept()和ignore()函数。 Qt 中有很多种事件:鼠标事件、键盘事件、大小改变的事件、位置移动的事件等等。对于事件的处理,我们Qt 中使用相对应的机制。 event()函数...

萨斯辈的呼唤
2014/01/16
5.6K
0
为Qt添加libevent的高性能事件循环--qt_eventdispatcher_libevent

qteventdispatcherlibevent 是基于 Libevent 的 Qt 事件调度器 特点 非常快速 支持Qt4和Qt5 不需要Qt的私有头文件 通过Qt4 和 Qt5 的事件调度,事件循环,定时器和socket通知测试...

渡世白玉
2014/03/07
1K
0
为Qt添加libev的高性能事件循环--qt_eventdispatcher_libev

qteventdispatcherlibev 是基于 libev 的 Qt 事件调度器。 特点 非常快速 支持 Qt4 和 Qt5 不需要 Qt 的私有头文件 通过了 Qt4 和 Qt5 的事件调度,事件循环,定时器和 socket 通知测试...

渡世白玉
2014/03/07
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
42分钟前
3
0
golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架...

非正式解决方案
今天
3
0
前端——使用base64编码在页面嵌入图片

因为页面中插入一个图片都要写明图片的路径——相对路径或者绝对路径。而除了具体的网站图片的图片地址,如果是在自己电脑文件夹里的图片,当我们的HTML文件在别人电脑上打开的时候图片则由于...

被毒打的程序猿
今天
2
0
Flutter 系列之Dart语言概述

Dart语言与其他语言究竟有什么不同呢?在已有的编程语言经验的基础上,我们该如何快速上手呢?本篇文章从编程语言中最重要的组成部分,也就是基础语法与类型变量出发,一起来学习Dart吧 一、...

過愙
今天
2
0
rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部