一.自定义事件的发送和接收
Qt中的事件处理机制,通过系统的事件处理层层传递,一直到直接接收事件的对象。
Qt中事件发送的行数有两个:
QApplication::sendEvent(QObject *receiver, QEvent *event);
和
QApplication::postEvent(QObject *receiver, QEvent *event);
参数QObject *receiver: 表明事件发送的对象
参数QEvent *event:发送的事件对象
sendEvent和postEvent这两个函数的区别在于:
sendEvent:
Sends event event directly to receiver receiver, using the notify() function. Returns the value that was returned from the event handler.
The event is not deleted when the event has been sent. The normal approach is to create the event on the stack
直接发送事件给接收者,是阻塞的,等待事件处理完成才返回
postEvent
Adds the event event, with the object receiver as the receiver of the event, to an event queue and returns immediately.
The event must be allocated on the heap since the post event queue will take ownership of the event and delete it once it has been posted. It is not safe to access the event after it has been posted.
When control returns to the main event loop, all events that are stored in the queue will be sent using the notify() function.
发送到消息队列,是非阻塞,发送完成后直接返回
自定义事件:
#pragma once
#include <QObject>
#include <QEvent>
#include <QString>
class MyEvent :public QObject, public QEvent {
Q_OBJECT
public:
MyEvent();
~MyEvent();
static QEvent::Type getMyEventType() {
return _myEventType;
}
void setInfo(QString info);
QString&getInfo() {
return _info;
}
private:
static QEvent::Type _myEventType;
QString _info;
};
#include "MyEvent.h"
MyEvent::Type MyEvent::_myEventType = (QEvent::Type)QEvent::registerEventType(QEvent::User + 100);
MyEvent::MyEvent()
: QEvent(_myEventType) {
}
MyEvent::~MyEvent() {
}
void MyEvent::setInfo(QString info) {
_info = info;
}
调用
//发送事件
void QtWidgetsEvent::slotSendEvent() {
MyEvent* e = new MyEvent();
e->setInfo("Sucess!");
#if 1//阻塞发送
QApplication::sendEvent(this, e);
#else //非阻塞发送
QApplication::postEvent(this, e);
#endif
}
//接收事件
bool QtWidgetsEvent::event(QEvent *e) {
if (e->type() == MyEvent::getMyEventType()){
MyEvent* myEvent = dynamic_cast<MyEvent*>(e);
qDebug()<< myEvent->getInfo();
}
return QWidget::event(e);
}
二、事件过滤器
当输入姓名之后点击回车键,光标直接跳到序号上面;学号输入完成之后,点击回车键,光标直接跳到信息的编辑框上面;
事件过滤器:对象A用来监视发送给对象B的事件。当有事件发送给对象B时,首先对象A会接收到,并且处理掉
- 首先在初始化的时候,对象B调用函数 installEventFilter(A) 添加事件过滤器,参数就是对象A。说明B的事件要通过A来处理;
//添加事件过滤器
ui.lineEditName->installEventFilter(this);
ui.lineEditID->installEventFilter(this);
ui.lineEditInfo->installEventFilter(this);
- A对象实现虚函数:
bool QtWidgetsEvent::eventFilter(QObject *watched, QEvent *event) {
if (watched == ui.lineEditName && event->type() == QEvent::KeyPress) {
QKeyEvent* key = dynamic_cast<QKeyEvent*>(event);
if (key->key() == Qt::Key_Enter){//回车键
ui.lineEditID->setFocus();
}
} else if(watched == ui.lineEditID && event->type() == QEvent::KeyPress) {
QKeyEvent* key = dynamic_cast<QKeyEvent*>(event);
if (key->key() == Qt::Key_Enter) {//回车键
ui.lineEditInfo->setFocus();
}
}
return QWidget::eventFilter(watched, event);
}
aaa