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

  • 相关阅读:
    背水一战 Windows 10 (26)
    背水一战 Windows 10 (25)
    背水一战 Windows 10 (24)
    背水一战 Windows 10 (23)
    背水一战 Windows 10 (22)
    背水一战 Windows 10 (21)
    背水一战 Windows 10 (20)
    背水一战 Windows 10 (19)
    背水一战 Windows 10 (18)
    背水一战 Windows 10 (17)
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/12733966.html
Copyright © 2011-2022 走看看