码迷,mamicode.com
首页 > 其他好文 > 详细

Qt发送事件与自定义事件

时间:2020-03-20 23:59:19      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:ast   button   string   非阻塞   inline   ext   write   mod   val   

发送事件

主要函数:

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发送事件与自定义事件

标签:ast   button   string   非阻塞   inline   ext   write   mod   val   

原文地址:https://www.cnblogs.com/hjxzjp/p/12535753.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!