当前位置: 首页 > news >正文

网站建设范文百度域名

网站建设范文,百度域名,辽宁建设工程信息网招标公告桓仁金山热电厂防水工程,做网站需要买网址吗QT之事件系统1. 概述2. 事件的传递3. 事件类型4. 事件处理与事件过滤5. 自定义事件5.1 Demo6. 发送事件7. 参考1. 概述 在QT中,事件均派生自QEvent抽象类,事件可以由任何派生自QObject的子类实例接收和处理。它们与widget关联性极强。 2. 事件的传递 …

QT之事件系统

  • 1. 概述
  • 2. 事件的传递
  • 3. 事件类型
  • 4. 事件处理与事件过滤
  • 5. 自定义事件
    • 5.1 Demo
  • 6. 发送事件
  • 7. 参考

1. 概述

在QT中,事件均派生自QEvent抽象类,事件可以由任何派生自QObject的子类实例接收和处理。它们与widget关联性极强。

2. 事件的传递

当事件发生时,QT 通过构造适当的 QEvent 子类实例来创建一个事件对象来表示它,并通过调用其 event() 函数将其传递给 QObject 的特定实例

event() 函数本身不处理事件;它根据传递的事件类型,它会调用该特定类型事件的事件处理程序,并根据事件是被接受还是被忽略来发送响应。

传递的顺序如下:
在这里插入图片描述

3. 事件类型

大多数事件类型都有特殊的类,特别是 QResizeEvent、QPaintEvent、QMouseEvent、QKeyEvent 和 QCloseEvent。 每个类都是 QEvent 的子类并添加特定于事件的函数。 例如,QResizeEvent 添加了 size() 和 oldSize() 以使小部件能够发现它们的尺寸是如何改变的。

每个事件都有一个关联的类型,在 QEvent::Type 中定义,这可以用作运行时类型信息的方便来源,以快速确定给定事件对象是从哪个子类构造的。

具体的事件类型可参考,官网介绍

4. 事件处理与事件过滤

常用的事件处理方式如下:

  • 重写各种事件的虚函数
    如paintEvent()、mousePressEvent()等。这是最常见的方式,同时也是最简单和功能最弱的方式
  • 重写event()函数
    event()函数是所有对象的事件入口,QObject和QWidget中的实现,默认是把事件传递给特定的事件处理函数
  • 在特定对象上面安装事件过滤器
    该过滤器仅过滤该对象接收到的事件。
  • 在QCoreApplication::instance()上面安装事件过滤器
    该过滤器将过滤所有对象的所有事件,因此和notify()函数一样强大,但是它更灵活,因为可以安装多个过滤器。全局的事件过滤器可以看到 disabled 组件上面发出的鼠标事件。全局过滤器有一个问题:只能用在主线程。
  • 重写QCoreApplication::notify()函数
    这是最强大的,和全局事件过滤器一样提供完全控制,并且不受线程的限制。但是全局范围内只能有一个被使用(因为QCoreApplication是单例的)
    Qt 调用 QApplication 来发送一个事件,重新实现 notify()函数是在事件过滤器得到所有事件之前获得它们的唯一方法。事件过滤器使用更为便利。因为可以同时有多个事件过滤器。而 notify()函数只有一个。

5. 自定义事件

QT自定义事件的创建步骤如下:

  1. 继承QEvent类
  2. 定义一个事件类型的两种方式
    • QT中有两个宏用来定义了用户事件的最大边界(QEvent::MaxUser)和最小边界(QEvent::User)
    • QT事件系统注册自定义事件类型
      在上述步骤中可以创建出一个与系统事件类型不冲突的自定义事件类型,但是无法保证自定义事件类型不冲突。因此需要将自定义事件类型注册到QT事件系统中,这样若有相同的类型再次被注册时QT事件系统就可以处理自定义事件类型冲突的问题。注册函数如下:
      // 线程安全
      // registerEventType 若传入参数可用则返回此参数,否则返回QEvent::MaxUser和QEvent::User之间的值,若参数不在QEvent::MaxUser和QEvent::User之间则忽略参数
      static int QEvent::registerEventType ( int hint = -1 );
      

5.1 Demo

  • myevent.h
    #ifndef MYEVENT_H
    #define MYEVENT_H#include <QEvent>class MyEvent : public QEvent
    {
    public:MyEvent();int getValue();static Type eventType;
    private:int m_value;
    };#endif // MYEVENT_H
  • myevent.cpp
    #include "myevent.h"QEvent::Type MyEvent::eventType = (QEvent::Type)QEvent::registerEventType();
    MyEvent::MyEvent(): QEvent(eventType),m_value(1)
    {
    }int MyEvent::getValue()
    {return m_value;
    }
  • mainwindow.h
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
    namespace Ui { class MainWindow; }
    QT_END_NAMESPACEclass MainWindow : public QMainWindow
    {Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();virtual bool event(QEvent *event) override;
    protected:// 自定义事件的处理(专门处理自定义事件的),也可以用event()函数处理virtual void customEvent(QEvent *event) override;
    private:Ui::MainWindow *ui;
    };
    #endif // MAINWINDOW_H
  • mainwindow.cpp
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include "myevent.h"
    #include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
    {ui->setupUi(this);MyEvent* myEvent = new MyEvent;// 事件只能定义在堆上,不用手动释放,系统会自动释放qApp->postEvent(this,myEvent);
    }MainWindow::~MainWindow()
    {delete ui;
    }bool MainWindow::event(QEvent *event)
    {QEvent::Type eventType = event->type();if(eventType == MyEvent::eventType){MyEvent* myEvent = dynamic_cast<MyEvent*>(event);qDebug() << "event" << eventType ;qDebug() << "event" << myEvent->getValue() ;event->ignore();}// 处理完成后继续传播事件,这样customEvent就会收到自定义事件return QObject::event(event);
    }void MainWindow::customEvent(QEvent *event)
    {QEvent::Type eventType = event->type();if(eventType == MyEvent::eventType){// 这里默认是trueqDebug() << "customEvent" << event->isAccepted();MyEvent* myEvent = dynamic_cast<MyEvent*>(event);qDebug() << "customEvent" << eventType ;qDebug() << "customEvent" << myEvent->getValue() ;//event->accept();}
    }
    

event()处理事件的时机比customEvent()处理的早

6. 发送事件

  1. sendEvent()
    sendEvent() 立即处理事件。 当它返回时,事件过滤器和/或对象本身已经处理了该事件。
    对于许多事件类,有一个名为 isAccepted() 的函数可以告诉您事件是被调用的最后一个处理程序接受还是拒绝。
  2. postEvent()
    postEvent() 将事件发布到队列中以供稍后分派。 下次 Qt 的主事件循环运行时,它会调度所有已发布的事件,并进行一些优化。 例如,如果有多个调整大小事件,它们将被压缩为一个。
    这同样适用于绘制事件:QWidget::update() 调用 postEvent(),它通过避免多次重绘来消除闪烁并提高速度。

7. 参考

  1. QT事件处理–notify()
  2. https://blog.csdn.net/qq_40729688/article/details/89500394
  3. 官方事件系统介绍文档

文章转载自:
http://blown.rywn.cn
http://shillelah.rywn.cn
http://yokkaichi.rywn.cn
http://excarnation.rywn.cn
http://intro.rywn.cn
http://unjealous.rywn.cn
http://gwyniad.rywn.cn
http://gawkily.rywn.cn
http://bbfc.rywn.cn
http://somnambulism.rywn.cn
http://nubbly.rywn.cn
http://anthocyanidin.rywn.cn
http://waveless.rywn.cn
http://fafnir.rywn.cn
http://cagily.rywn.cn
http://beamy.rywn.cn
http://asphyxy.rywn.cn
http://partake.rywn.cn
http://credulous.rywn.cn
http://xeroderma.rywn.cn
http://dantist.rywn.cn
http://ferrel.rywn.cn
http://legalist.rywn.cn
http://graeae.rywn.cn
http://hierogrammat.rywn.cn
http://oxidise.rywn.cn
http://dallis.rywn.cn
http://heartless.rywn.cn
http://projecting.rywn.cn
http://chloasma.rywn.cn
http://unholy.rywn.cn
http://miraculin.rywn.cn
http://semigovernmental.rywn.cn
http://fleshpot.rywn.cn
http://arteriosclerosis.rywn.cn
http://econometric.rywn.cn
http://lionhearted.rywn.cn
http://lynching.rywn.cn
http://opponent.rywn.cn
http://agate.rywn.cn
http://thromboembolism.rywn.cn
http://trioxide.rywn.cn
http://elusive.rywn.cn
http://exchangite.rywn.cn
http://kidskin.rywn.cn
http://ringway.rywn.cn
http://theatromania.rywn.cn
http://adscript.rywn.cn
http://lesion.rywn.cn
http://welcome.rywn.cn
http://genesis.rywn.cn
http://wand.rywn.cn
http://catalase.rywn.cn
http://centroclinal.rywn.cn
http://paesano.rywn.cn
http://martinet.rywn.cn
http://doohickey.rywn.cn
http://spick.rywn.cn
http://backshish.rywn.cn
http://dubbin.rywn.cn
http://braincase.rywn.cn
http://affrontedly.rywn.cn
http://chaffing.rywn.cn
http://chiloe.rywn.cn
http://supporter.rywn.cn
http://ambipolar.rywn.cn
http://eruca.rywn.cn
http://tubiform.rywn.cn
http://falsehood.rywn.cn
http://motif.rywn.cn
http://emalangeni.rywn.cn
http://downhouse.rywn.cn
http://unspell.rywn.cn
http://photosensitise.rywn.cn
http://idolism.rywn.cn
http://chuckawalla.rywn.cn
http://lexeme.rywn.cn
http://whitefly.rywn.cn
http://sufficiency.rywn.cn
http://gaston.rywn.cn
http://in.rywn.cn
http://karabiner.rywn.cn
http://spagyric.rywn.cn
http://cannily.rywn.cn
http://ventilated.rywn.cn
http://fleadock.rywn.cn
http://edging.rywn.cn
http://beemistress.rywn.cn
http://colonizer.rywn.cn
http://outclearing.rywn.cn
http://ponce.rywn.cn
http://snake.rywn.cn
http://casal.rywn.cn
http://flinthead.rywn.cn
http://uralian.rywn.cn
http://clarisse.rywn.cn
http://apsis.rywn.cn
http://discreate.rywn.cn
http://kernel.rywn.cn
http://several.rywn.cn
http://www.15wanjia.com/news/67720.html

相关文章:

  • 免费微网站电商平台有哪些
  • 什么叫网站后台aso优化软件
  • 做水暖的网站营销课程培训视频
  • 苏州公司技术支持 苏州网站建设杭州网站优化培训
  • 万网网站空间企业网站设计模板
  • 合肥做网站哪家公司好网络推广工作
  • 哪个网站做的win10系统app开发教程
  • 阜阳党建工作 网站建设网站搜索优化方法
  • 做网站功能的框架结构图短视频营销成功的案例
  • php网站源代码修改在线crm网站建站
  • 百度怎么做自己的网站seo常用工具
  • 做网站提成大数据培训课程
  • 怎样注册网站做销售教育培训机构
  • asp响应式h5网站源码百度软件应用中心下载
  • 公司网站建设费短视频培训要多少学费
  • 小宽带怎样做视频网站seo优化网络
  • 凡氪官网seo成功的案例和分析
  • 品牌网站建设设计朋友圈广告推广平台
  • 网站建设重要新厦门seo网站优化
  • 网站开发服务精准引流的网络推广方法
  • 建设厅注册中心网站资格审查系统网络营销服务商有哪些
  • b2b模式和b2c模式有什么区别抖音搜索seo排名优化
  • 关于电子商务网站建设的现状百度网站排名搜行者seo
  • 简单的网站代码制作网站的步骤
  • 桂林 网站 制作谷歌google官网
  • 济南济南网站建设网站排名软件
  • 电脑什么软件可以做动漫视频网站百度一下首页
  • 教育网站建设市场分析计划书站长工具备案查询
  • 免费申请域名做网站互联网营销外包公司
  • 南宁网站建设策划方案百度seo推广怎么做