有时为了开发需要,我们希望自定义事件来完成某种目的。实现自定义事件的步骤如下:
自定义的事件类代码如下:
头文件
// -------------------------- 自定义事件 --------------------------------
class CustomerEvent : public QEvent
{
public:
CustomerEvent(QString valueString = "");
~CustomerEvent();
static Type eventType();
QString getValueString(void);
private:
static Type m_EventType;
QString m_String;
};
源文件
QEvent::Type CustomerEvent::m_EventType = QEvent::None;
CustomerEvent::CustomerEvent(QString valueString) : QEvent(eventType())
{
m_String = valueString;
}
CustomerEvent::~CustomerEvent()
{
}
QEvent::Type CustomerEvent::eventType()
{
// 创建事件Type
if (m_EventType == QEvent::None)
m_EventType = (QEvent::Type)QEvent::registerEventType();
return m_EventType;
}
QString CustomerEvent::getValueString(void)
{
return m_String;
}
这里使用了CustomerEvent::eventType()函数为事件创建了类型。
发送事件有两种方法,一种是使用sendEvent()函数,一种是使用postEvent()函数。
使用PostEvent和SendEvent的例子如下:
头文件
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
protected:
virtual bool event(QEvent *event) override;
};
这里定义了一个Widget, 其中event()函数后面处理自定义事件时会用到。
源文件
Widget::Widget(QWidget *parent) :
QWidget(parent)
{
// 创建按钮并布局
QPushButton *button = new QPushButton("CreateEvent", this);
QVBoxLayout *mainLayout = new QVBoxLayout(this);
mainLayout->addWidget(button);
this->setGeometry(100, 100, 800, 600);
// 建立连接, 发送信号
QObject::connect(button, &QPushButton::clicked, [=](void)->void{
// 使用PostEvent方式发送
CustomerEvent *customerEvent = new CustomerEvent("PostCustomerEvent");
QCoreApplication::postEvent(this, customerEvent);
// 使用SendEvent方式发送
CustomerEvent *sendCustomerEvent = new CustomerEvent("SendCustomerEvent");
bool result = QCoreApplication::sendEvent(this, sendCustomerEvent);
qDebug() << "The Dispose Result Is " << result;
delete sendCustomerEvent;
});
}
Widget::~Widget()
{
}
这里创建了一个按钮,当按钮按下时发送自定义的事件。
bool Widget::event(QEvent *event)
{
if (event->type() == CustomerEvent::eventType())
{
CustomerEvent *customerEvent = dynamic_cast<CustomerEvent*>(event);
qDebug() << customerEvent->getValueString();
return true;
}
return QWidget::event(event);
}
函数的返回true表示已经处理了此事件,否则返回false。
整体程序的运行结果为:
“SendCustomerEvent”
The Dispose Result Is true
“PostCustomerEvent”
可见,函数先处理了sendEvent()函数的事件, 等事件循环运行时分发给当前对象后处理。