概述
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(...)
{
...
}
...
}
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
最后
以上就是单身超短裙为你收集整理的Qt中的消息通知和事件发送的全部内容,希望文章能够帮你解决Qt中的消息通知和事件发送所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复