第43课 发送自定义事件(上)

1、在程序中发送事件

    1.1、 Qt可以在程序中自主发送事件
        1.1.1、 堵塞型事件发送
            A、 事件发送完后需要等待事件处理完成

        1.1.2、 非堵塞型事件发送
            A、 事件发送后立即返回
            B、 事件被发送到事件队列中等待处理

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

    1.3、注意事项
        1.3.1、 sendEvent中事件对象生命期由Qt程序管理
            A、 同时支持栈事件对象和堆事件对象的发送
        1.3.2、 postEvent中事件对象的生命周期由Qt平台管理
            A、 只能发送堆事件对象
            B、 事件被处理后由Qt平台销毁
            C、 事件发送过程

    1.4、事件发送过程、

        1.4.1、使用sendEvent发送事件对象
                

        1.4.2、使用postEvent发送事件对象
                        


#ifndef WIDGET_H
#define WIDGET_H
#include <QtGui/QWidget>
#include <QPushButton>
class Widget : public QWidget
{
    Q_OBJECT
private:
    QPushButton m_pushButton;
    void testSendEvent();
    void testPostEvent();
protected slots:
    void onButtonClicked();
public:
    Widget(QWidget *parent = 0);
    bool event(QEvent *evt);
    ~Widget();
};
#endif // WIDGET_H


//两种方式的比较、

#include "Widget.h"
#include <QDebug>
#include <QApplication>
#include <QMouseEvent>
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()";
    //testPostEvent();
    testSendEvent();
}
void Widget::testSendEvent()
{
    //创建一个鼠标左键双击事件对象(dbcEvt:double  clicked  event):
    //参数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);
    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);
    qDebug() << "Before PostEvent()";
    //postEvent以后,事件对象的生命周期由消息队列来自行负责管理。
    QApplication::postEvent(this, dbcEvt);//相当于直接调用Widget::event();,立即返回。
    
    qDebug() << "After PostEvent()";
}
bool Widget::event(QEvent *evt)//自定义事件
{
    if(evt->type() == QEvent::MouseButtonDblClick)
    {
        qDebug() << "event()" << evt;//执行双击Button事件
    }
    
    //如果不是左键单击2次,就交给父组件处理
    return QWidget::event(evt);//将事件抛给父组件,返回事件是否执行成功。
}
Widget::~Widget()
{
    
}


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

    2.1、 菜单栏中删除功能的实现
        2.1.1、自定义事件对象KeyPress
        2.1.2、 自定义事件对象KeyRelease
        2.1.3、 发送事件KeyPress
        2.1.4、 发送事件KeyRelease

                            

NotePad文本编辑器程序

头文件中声明。



//删除选中文字功能。
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()
{
    this->close();
}


3、小结

    3.1、 Qt程序中能够自主地发送系统预定义的事件(系统中存在的事件)
    3.2、 QApplication类提供了支持事件发送的静态成员函数
    3.3、 sendEvent发送事件后需要等待事件处理完成(阻塞的)
    3.4、 postEvent发送事件后立即返回(非阻塞的)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值