• 事件的发送和分发器


    事件的发送:

    • 手动发送
    • 非堵塞发送  senfEvent()
    • 堵塞发送      postEvent()

    手动发送:

    1. QEvent *event=new QEvent(QEvent::Hide);
    2. QApplication::sendEvent(this,event);//手动发送事件

    非堵塞发送:

     bool QCoreApplication::sendEvent(QObject *receiver,QEvent *event)

    • 在堆栈上创建
    • 立刻处理给定的事件 
    1. QKeyEvent myevent(QEvent::KeyPress,Qt::Key_V,Qt::NoModifier);
    2. qApp->sendEvent(this,&myevent);//发送到this

    堵塞发送:

    void QCoreAppliCation::postEvent(QObject*obj,QEvent*event,int priority)

    • 会先把事件放到等待调度的队列中
    • 必须分配在堆空间
    1. QKeyEvent myevent(QEvent::KeyPress,Qt::Key_V,Qt::NoModifier);
    2. qApp->sendEvent(this,&myevent);//发送到this
    3. QKeyEvent *myEvent=new QKeyEvent(myevent);
    4. qApp->postEvent(this,myEvent,Qt::NoModifier);

     

     事件分发器:

    简单的讲就是管理事件的地方,所有的事件都必须先经过这里,然后在进行转发。当bool  QEvent*  为true时,就不会在向下转发,false的话还会向下分发。

     

    事件分发器的函数为:

    bool  event(QEvent* event)

    下面举个例子:

     在widget.h文件中添加以下事件

    1. void mousePressEvent(QMouseEvent *event);//鼠标点击事件
    2. void mouseReleaseEvent(QMouseEvent *event);//鼠标松开事件
    3. bool event(QEvent *event);//事件分发器

     函数的实现:

    1. void Widget::mousePressEvent(QMouseEvent *event)//鼠标点击事件
    2. {
    3. qDebug()<<"鼠标点击";
    4. }
    5. void Widget::mouseReleaseEvent(QMouseEvent *event)//鼠标松开事件
    6. {
    7. qDebug()<<"鼠标松开";
    8. }
    9. bool Widget::event(QEvent *event)//事件分发器
    10. {
    11. if(event->type()==QMouseEvent::MouseButtonPress)
    12. {
    13. qDebug()<<"被分发器拦截";
    14. return true;
    15. }
    16. else
    17. {
    18. return QWidget::event(event);
    19. }
    20. }

     功能展示:点击鼠标

     

     

  • 相关阅读:
    python基础语法(十)
    WPF --- 触摸屏下的两个问题
    SpringBoot SpringBoot 基础篇 1 快速上手SpringBoot 1.6 入门案例解析【parent】
    python+java+SSM+vue勤工助学管理系统#计算机毕业设计
    好的架构是进化来的,不是设计来的
    Revit API: Pipe & Duct -管道和风管
    python 获取本机ip
    ASP.NET 6启动时自动创建MongoDB索引
    HTTP协议 和 HTTPS协议
    iOS之crash分析篇--捕获signal类型的崩溃信息
  • 原文地址:https://blog.csdn.net/qq_45303986/article/details/127833438