发送事件
主要函数:
bool QCoreApplication::sendEvent ( QObject *receiver, QEvent * event )
void QCoreApplication::postEvent ( QObject *receiver, QEvent * event )
sendEvent :阻塞型发送事件,在发送事件时直接调用Event函数(能够在堆 或者栈上发送)
postEvent :非阻塞型发送事件,在发送事件的时候直接将事件发送到EventQueue中然后再处理(只能在堆上发送)
例子:
包含头文件
QKeyEvent keyPress = QKeyEvent(QEvent::KeyPress,Qt::Key_Delete,Qt::NoModifier);
QKeyEvent keyRelease = QKeyEvent(QEvent::KeyRelease,Qt::Key_Delete,Qt::NoModifier);
QApplication::sendEvent(&plainText,&keyPress);
QApplication::sendEvent(&plainText,&keyRelease);
阻塞发送按键事件。
自定义事件类
自定义事件类条件
自定义的事件类必须继承与QEvent
自定义的事件类必须有全局唯一的Type值
程序中必须提供处理自定义事件对象的方法
自定义事件类步骤
1、将QEvent作为父类继承
myWriteEvent::myWriteEvent(QString data) : QEvent(TYPE)
{
m_data = data;
}
2、指定全局唯一的Type值
例如:
class xxxEvent : public QEvent
{
public:
static const Type TYPE = static_cast<Type>(QEvent::User+0x01)
}
class myWriteEvent : public QEvent
{
QString m_data;
public:
explicit myWriteEvent(QString data ="");
static const Type TYPE = static_cast<Type>(QEvent::User+0x01);//指定Type值
QString data();//获取数据函数
};
Qt中事件的Type值
1、每个事件类都拥有一个全局唯一的Type
2、自定义事件类的Type值也需要自定义
3、自定义事件类使用 QEvent::User 之后的值作为Type值
4、程序中保证Type唯一 QEvent::User+VALUE
处理自定义事件对象的方法
1、将事件过滤器安装到目标对象在eventFilter()函数中编写自定义事件的处理逻辑
//事件过滤器
bool myEvent::eventFilter(QObject* obj, QEvent* evt)
{
if((obj == &m_lineEdit)&&(evt->type() == myWriteEvent::TYPE))//m_lineEdit 对象的 myWriteEvent::TYPE 事件
{
myWriteEvent* e = dynamic_cast<myWriteEvent*>(evt);
qDebug()<<"Receive:"<< e->data();
m_lineEdit.insert(e->data());
return true;
}
return QWidget::eventFilter(obj,evt);
}
2、在目标对象的类中重写事件处理函数在event()函数中编写自定义事件的处理逻辑
bool myEvent::event(QEvent* evt)
{
if(evt->type() == QMouseEvent::MouseButtonDblClick)
{
qDebug()<<"event:send";
myWriteEvent e("hello this is test String");
QApplication::sendEvent(&m_lineEdit,&e);
qDebug()<<"event:send ok";
}
return QWidget::event(evt);
}
//安装事件过滤器
m_lineEdit.installEventFilter(this);