zoukankan      html  css  js  c++  java
  • 第四十三课、发送自定义事件(上)------------------狄泰软件学院

    一、在程序中发送事件

    1、Qt可以在程序中自主发送事件

    (1)、堵塞型事件发送

    A、事件发送完后需要等待事件处理完成

    (2)、非堵塞型事件发送

    A、事件发送后立即返回

    B、事件被发送到事件队列中等待处理

    2、QApplication类提供了支持事件发送的静态成员函数

    3、注意事项

    (1)、sendEvent中事件对象生命期由Qt程序管理

    A、同时支持栈事件对象和堆事件对象的发送

    (2)、postEvent中事件对象的生命周期由Qt平台管理

    A、只能发送堆事件对象

    B、事件被处理后由Qt平台销毁

    4、事件发送过程

    #include "Widget.h"
    #include <QMouseEvent>
    #include <QApplication>
    #include <QDebug>
    
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
    {
        m_pushButton.setParent(this);
        m_pushButton.setText("Test");
    
        connect(&m_pushButton, SIGNAL(clicked()), this, SLOT(onButtonClicked()));
    }
    
    void Widget::onButtonClicked()
    {
    
        qDebug() << "void Widget::onButtonClicked()";
        testSendEvent();
        // testPostEvent();
    
    }
    
    void Widget::testSendEvent()
    {
        //创建一个鼠标左键双击事件对象:
        //参数type:QEvent::MouseButtonPress, QEvent::MouseButtonRelease,QEvent::MouseButtonDblClick, or QEvent::MouseMove之一
        //参数position:鼠标指针相对于接收窗口的位置
        //参数button:左键、右键等发生的事件。如果是mouseMove事件,则为Qt::NoButton
        //参数buttons和modifiers:当事件发生时鼠标和键盘的状态位
        QMouseEvent dbcEvt(QEvent::MouseButtonDblClick, QPoint(0, 0),Qt::LeftButton,
                           Qt::NoButton,Qt::NoModifier);//dbcEvt:double clicked event
    
        qDebug() << "Before sendEvent()";
    
        QApplication::sendEvent(this, &dbcEvt);//相当于直接调用Widget::event();
    
        qDebug() << "After sendEvent";
    
    }
    
    void Widget::testPostEvent()
    {
        //postEvent必须发送一个堆对象
        QMouseEvent*  dbcEvt = new QMouseEvent(QEvent::MouseButtonDblClick, QPoint(0, 0),Qt::LeftButton, Qt::NoButton,Qt::NoModifier);//dbcEvt:double clicked event
    
        qDebug() << "Before postEvent()";
    
        //postEvent以后,事件对象的生命期由消息队列来自行负责管理
        QApplication::postEvent(this, dbcEvt);//立即返回
    
        qDebug() << "After postEvent";
    }
    
    bool Widget::event(QEvent *evt)
    {
        if(evt->type() == QEvent::MouseButtonDblClick)
        {
            qDebug() << "event(): " << evt;
        }
        return QWidget::event(evt);
    }
    
    Widget::~Widget()
    {
    }
    两种方式比较

    二、文本编辑器中的事件发送

    1、菜单栏中删除功能的实现

    (1)、自定义事件对象KeyPress

    2)、自定义事件对象KeyRelease

    (3)、发送事件KeyPress

    (4)、发送事件KeyRelease

    文本编辑器程序:

    void MainWindow::onFileDelete()
    {
        QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Delete,Qt::NoModifier);
        QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Delete,Qt::NoModifier);
    
        QApplication::sendEvent(&mainEdit, &keyPress);//发送事件模拟键盘的delete键
        QApplication::sendEvent(&mainEdit, &keyRelease);
    
    }
    void MainWindow::onFileExit()
    {
        close();
    }
    onFileDelete()和onFileExit()的实现

    三、小结

    (1)、Qt程序中能够自主地发送系统预定义的事件(系统中存在的事件)

    (2)、QApplication类提供了支持事件发送的静态成员函数

    (3)、sendEvent发送事件后需要等待事件处理完成

    (4)、postEvent发送事件后立即返回

  • 相关阅读:
    浅谈Web前端开发未来的8个的趋势
    人工智能必备数学知识学习笔记7:矩阵的应用和更多矩阵相关的高级话题
    人工智能必备数学知识学习笔记6:矩阵(矩阵不只是mn个数字)
    人工智能必备数学知识学习笔记5:向量的高级话题
    人工智能必备数学知识学习笔记4:零向量
    人工智能必备数学知识学习笔记3:向量的基本运算
    人工智能必备数学知识学习笔记2:向量
    人工智能必备数学知识学习笔记1:线性代数与机器学习
    Python入门学习笔记12:pythonnic补充
    Python入门学习笔记11:原生爬虫
  • 原文地址:https://www.cnblogs.com/gui-lin/p/6417467.html
Copyright © 2011-2022 走看看