第43课 - 发送预定义事件

1、在程序中发送事件 

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

     -阻塞型事件发送 

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

     -非阻塞型事件发送 

              事件发送后立即返回 

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

          

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

     -阻塞型发送函数: 

                  bool sendEvent(QObject* receiver,  QEvent* event); 

     -非阻塞型发送函数: 

                  bool postEvent(QObject* receiver,  QEvent* event);

注意事项 

     -sendEvent中事件对象的生命期由Qt程序管理 

                  . 同时支持栈事件对象堆事件对象的发送 

     -postEvent中事件对象的生命期由Qt平台管理 

                  . 只能发送堆事件对象 

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

使用sendEvent发送事件对象 

              小贴士: 

                            消息发送过程可以理解为:在sendEvent()函数内 

                            部直接调用Qt对象的event()事件处理函数。 

                             这样event函数returnsendEvent才能return

 

使用postEvent发送事件对象 

2、编程实验 

在程序中发送事件   43-1.pro 

Widgte.cpp

#ifndef WIDGET_H
#define WIDGET_H

#include <QtGui/QWidget>
#include <QPushButton>

class Widget : public QWidget
{
    Q_OBJECT
    
    QPushButton m_pushButton;

    void testSendEvent();
    void testPostEvent();
protected slots:
    void onButtonClicked();
public:
    Widget(QWidget *parent = 0);
    bool event(QEvent* evt);
    ~Widget();
};

#endif // WIDGET_H

Widget.cpp

#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()
{
    // testSendEvent();
    //testPostEvent();
}

void Widget::testSendEvent()
{
	//0,0位置鼠标左键双击事件,没有按键盘任意键
    QMouseEvent dbcEvt(QEvent::MouseButtonDblClick, QPoint(0, 0), Qt::LeftButton, Qt::NoButton, Qt::NoModifier);

    qDebug() << "Before sendEvent()";

    QApplication::sendEvent(this, &dbcEvt);//将事件发送给当前Widget对象

    qDebug() << "After sendEvent()";
}

void Widget::testPostEvent()
{
    QMouseEvent* dbcEvt = new QMouseEvent(QEvent::MouseButtonDblClick, QPoint(0, 0), Qt::LeftButton, Qt::NoButton, Qt::NoModifier);

    qDebug() << "Before postEvent()";

    QApplication::postEvent(this, dbcEvt);
	
	//在点击按钮后会产生一个点击事件,在onButtonClicked()槽函数内部调用testPostEvent()
	//产生一个新事件,当然不会立即处理,会放入事件队列,等点击事件处理完后再处理

    qDebug() << "After postEvent()";
}

bool Widget::event(QEvent* evt)//重写event()函数
{
    if( evt->type() == QEvent::MouseButtonDblClick )
    {
        qDebug() << "event(): " << evt;
    }

    return QWidget::event(evt);
}

Widget::~Widget()
{
    
}

1、当调用testSendEvent()

先双击窗口再点击按钮

2、当调用testPostEvent()

先双击窗口再点击按钮

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

 菜单栏中删除功能的实现

        1、定义事件对象KeyPress

        2、定义事件对象KeyRelease

        3、发送事件KeyPress

        4、发送事件KeyRelease

                            模拟键盘delete键的按下与释放

4、编程实验 

文本编辑器中的事件发送   NotePad.pro 

关联槽函数

connect(action, SIGNAL(triggered()), this, SLOT(onEditDelete()));

实现槽函数

void MainWindow::onEditDelete()
{
    QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Delete, Qt::NoModifier);//只按delete键(不包括ctrl等)事件
    QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Delete, Qt::NoModifier);//只释放

    QApplication::sendEvent(&mainEditor, &keyPress);//发送到编辑框对象
    QApplication::sendEvent(&mainEditor, &keyRelease);
}

5、小结 

Qt程序中能够自主的发送系统事件 

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

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

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

猜你喜欢

转载自blog.csdn.net/qq_39654127/article/details/81591590