Qt发送事件与自定义事件

Posted hjxzjp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt发送事件与自定义事件相关的知识,希望对你有一定的参考价值。

发送事件

主要函数:

bool QCoreApplication::sendEvent ( QObject *receiver, QEvent * event )

void QCoreApplication::postEvent ( QObject *receiver, QEvent * event )

sendEvent :阻塞型发送事件,在发送事件时直接调用Event函数(能够在堆 或者栈上发送)

postEvent :非阻塞型发送事件,在发送事件的时候直接将事件发送到EventQueue中然后再处理(只能在堆上发送)

例子:

包含头文件

#include <QKeyEvent>
#include <QApplication>
    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);

 

以上是关于Qt发送事件与自定义事件的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义参数与保留事件一起发送到 Firebase 分析

第四十四课发送自定义事件(下)

Qt - 由 qt 对象发送的信号调用由接收器对象覆盖的事件函数

第43课 发送自定义事件(上)

C# 窗体间传值(使用委托与自定义事件)

从活动中调用片段事件