• Qt中的消息通知和事件发送


    Qt中的消息通知和事件发送

    来源 https://my.oschina.net/shelllife/blog/68242

    Qt中的信号和槽机制、事件机制是其具有特色的两大机制。利用这两种机制可以轻松地实现需要的消息通知和事件通知。
    1、信号和槽机制
    • 充分使用Qt库中已经定义和实现好的对象的信号和槽函数,如按钮的clicked()/pressed()信号等,它们能满足很多的需求;
    • 自定义缺乏的信号和槽函数,借助Qt的元对象系统和内省机制,在创建类时添加Q_OBJECT宏,使用signals:/slots:标记添加自定义的信号/槽函数,使用时通过emit发送信号,用connect()函数连接信号和槽。
     
    2、事件机制
    • 充分使用Qt库中已经定义好的标准事件对象,如鼠标事件QMouseEvent、键盘事件QKeyPressEvent等,自定义实现事件的处理函数,如keyPressEvent(QEvent*);
    • 自定义需要的事件类型和实现QObject::customEvent(QEvent*)函数,使用Qt的postEvent和sendEvent函数发送事件通知。
    (1)、自定义事件:
    • 方式一;通过QEvent::Type指定事件类型的值,然后new一个该类型的自定义事件,如:
    const QEvent::Type MyEvent = (QEvent::Type)9393;
    QApplication::postEvent(object, new QCustomEvent(MyEvent));
    【QCustomEvent类是Qt3中的类,现在已经不推荐使用了。】
    QEvent::Type是Qt中的枚举类型,Qt定义了一大堆的库事件类型常数值,当然也允许用户自定义自己的事件类型值,但是自定义的值应大于1000(QEvent::User),且小于65535(QEvent::MaxUser).方便起见,可以使用int QEvent::registerEventType ( int hint = -1 ) [static]函数注册和保留一个自定义的事件类型值,这样可以避免不小心重复使用了同一个事件类型值,它保证每次得到一个未被使用的事件类型常数值,该函数是线程安全的,在Qt4.4中引入。
    • 方式二:通过继承QEvent创建新的事件类,如:
    class CMyCustomEvent:public QEvent
    {
    	public:
    		CMyCustomEvent(int data):m_iData(data),QEvent((QEvent::Type)9393){}
    	private:
    		int m_iData;
    		...
    };
    (2)、发送事件:postEvent/sendEvent/notify
    • postEvent函数:void QCoreApplication::postEvent ( QObject * receiver, QEvent * event ) [static]【异步】
    将事件放入事件消息队列中,然后立即返回,函数只将事件放入队列的尾端,不保证事件立即得到处理。事件必须是分配在堆上的,即new出来的,因为在事件被发送出去后,事件队列就拥有了事件的,事件处理完后Qt会自动delete该事件,因此在把事件posted出去后再尝试使用它是不安全的。
    当程序控制到达主事件循环时,事件队列中的所有事件才用notify函数发送。事件的处理是按照其发送到队列中的顺序进行的,如果想要控制事件的优先级,可以考虑它的带优先级参数的重载函数。
    void QCoreApplication::postEvent ( QObject * receiver, QEvent * event, int priority ) [static]【Qt4.3引入】
    这两个函数都是线程安全的。
    • sendEvent函数:bool QCoreApplication::sendEvent ( QObject * receiver, QEvent * event ) [static]【同步】
    用notify函数将事件直接派发给接收者和进行处理,返回事件处理者的返回值。事件会立即送至接受者,被发送后,Qt不会自动delete该事件,因此合适的做法是在栈上创建事件。
    • sendPostedEvents:
    void QCoreApplication::sendPostedEvents ( QObject * receiver, int event_type ) [static]
    将事件队列中用postEvent函数放入的对应接受者和事件类型的事件立即分发,但是来自窗口系统的事件不被分发,它们被processEvents()函数分发。
    如果接受者是null,则对应所有的接受者;如果event_type为0,则对应receiver的所有的事件。该函数必须和receiver在同一个线程内被调用。
    void QCoreApplication::sendPostedEvents () [static]
    分发事件队列中的所有事件,即清空事件队列。
    • notify:bool QCoreApplication::notify ( QObject * receiver, QEvent * event ) [virtual]
    这是事件机制中最基本的函数,所有的事件发送最终都要调用这个函数。它把事件信号发送给接受者,并返回receiver->event(event)处理的返回值。
     
    (3)、处理事件:void QObject::customEvent ( QEvent * event ) [virtual protected]
    通过重载实现customEvent函数,可以对自定义的事件进行灵活的处理,如:
    void MyWidget::customEvent(QEvent *event)
    {
    	if (event->type() == MyCustomEvent)
    	{
    	   QMessageBox msgBox;
    	   msgBox.setText("The is mycustomevent example.");
    	   msgBox.exec();
    	}
    	else if(...)
    	{
    		...
    	}
    	...
    }

    ============= End

  • 相关阅读:
    如何设置范围,使透视数据源记录可以自适应地改变
    Atitit..文件上传组件选择and最佳实践的总结(2)----HTTP
    AIDL(1)
    最好的年龄减肥
    2012在数据库技术会议上的讲话PPT打包
    左右 Java 于 finally 深度分析语句块
    R0-R37它是Arm 寄存器,那是,CPU内部。和GPIO注册所有外设。换句话说,要是arm的cpu,它包含了其他芯片公司将有R0-R37,和GPIO寄存器只有一个特定的芯片。
    使用方便 正则表达式grep,sed,awk(一)
    经验36--C#无名(大事,物...)
    IOS 图片压缩
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/12733966.html
Copyright © 2020-2023  润新知