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

     

  • 相关阅读:
    搞明白这八个问题,Linux系统就好学多了
    Fedora 25 Alpha版本今天发布啦
    Linux新手应掌握的10个基本命令
    PC-BSD 换名 TrueOS
    JPA+Springboot实现分页效果
    陈亮
    押尾光太郎
    岸部真明
    面试必备-网络的七层协议
    JavaScript中的快速排序
  • 原文地址:https://www.cnblogs.com/hjxzjp/p/12535753.html
Copyright © 2020-2023  润新知