zoukankan      html  css  js  c++  java
  • 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);

     

  • 相关阅读:
    [LeetCode] 952. Largest Component Size by Common Factor 按公因数计算最大部分大小
    [LeetCode] 951. Flip Equivalent Binary Trees 翻转等价二叉树
    [LeetCode] 950. Reveal Cards In Increasing Order 按递增顺序显示卡牌
    上周热点回顾(7.6-7.12)团队
    上周热点回顾(6.29-7.5)团队
    上周热点回顾(6.22-6.28)团队
    调用博客园 open api 的客户端示例代码团队
    【故障公告】阿里云 RDS 实例 CPU 100% 故障引发全站无法正常访问团队
    上周热点回顾(6.15-6.21)团队
    《证券投资顾问胜任能力考试》考试大纲
  • 原文地址:https://www.cnblogs.com/hjxzjp/p/12535753.html
Copyright © 2011-2022 走看看