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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM