学习自唐佐林老师的Qt
实验1:发送自定义事件
Widget.h
#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();
}
//阻塞式 事件发送函数sendEvent()
void Widget::testSendEvent()
{
//定义鼠标双击事件对象
/*参数:事件类型,鼠标双击事件
双击坐标点
指明是鼠标左键还是右键双击
在双击时没有按键盘上面的任意按键
*/
QMouseEvent dbcEvt(QEvent::MouseButtonDblClick, QPoint(0, 0), Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
qDebug() << "Before sendEvent()";
//给当前 Widget对象窗口发送一个鼠标双击事件,
QApplication::sendEvent(this, &dbcEvt);
qDebug() << "After sendEvent()";
}
//非阻塞式 事件发送函数 postEvent()
void Widget::testPostEvent()
{
//postEvent()事件发送函数中国发送的事件 必须是堆空间上面的事件对象
QMouseEvent* dbcEvt = new QMouseEvent(QEvent::MouseButtonDblClick, QPoint(0, 0), Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
qDebug() << "Before postEvent()";
//必须使用堆空间上面的事件对象调用 postEvent()事件发送函数
//给当前 Widget对象窗口发送一个鼠标双击事件,
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()
{
}
main.cpp
#include <QtGui/QApplication>
#include "Widget.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}