發送事件
主要函數:
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);
