Qt的事件机制和用途
来源:互联网 发布:悦木之源泥娃娃知乎 编辑:程序博客网 时间:2024/05/23 18:51
今天,想在界面上通过手势来显示一个对话框,学习了事件。
一、事件机制
* Spontaneous 事件,由窗口系统产生,它们被放到系统队列中,通过事件循环逐个处理。
* Posted 事件,由Qt或是应用程序产生,它们被Qt组成队列,再通过事件循环处理。
* Sent 事件,由Qt或是应用程序产生,但它们被直接发送到目标对象。
事件的处理流程大概是:先处理posted事件,然后处理spontaneous事件,当然是在没有执行退出事件前提下。send 事件并不在事件循环内处理,它们都直接被发送到了目标对象。
调用QApplication::exec()时,程序进入了Qt的事件循环,
while (!exit_was_called)
{
while(!posted_event_queue_is_empty)
{
process_next_posted_event();
}
while(!spontaneous_event_queue_is_empty)
{
process_next_spontaneous_event();
}
while(!posted_event_queue_is_empty)
{
process_next_posted_event();
}
}
可以在任何时候调用QApplication::sendPostedEvent(),强制Qt产生一个对象的posted事件。
二、产生事件
QT应用程序可以产生他们自己的事件,或是预定义类型,或是自定义类型。 这可以通过创建QEvent类或它的子类的实例,并且调用QApplication:postEvent()或QApplication::sendEvent()来实现。
这两个函数需要一个 QObject* 与一个QEvent * 作为参数,假如你调用postEvent(),你必须用 new 操作符来创建事件对象,Qt会它被处理后帮你删除它。假如你用sendEvent(), 你应该在栈上来创建事件。下面举两个例子:
一是posting 事件:
QApplication::postEvent(mainWin, new QKeyEvent(QEvent::KeyPress,Key_X,'X',0));
二是sending 事件:
QKeyEvent event(QEvent::KeyPress, Key_X, 'X', 0);
QApplication::sendEvent(mainWin, &event);
三、自定义事件
演示如何post一个定制事件的代码片段:
const QEvent::Type MyEvent = (QEvent::Type)1234;
...
QApplication::postEvent(obj, new QCustomEvent(MyEvent));
事件必须是QCustomEvent类型(或子类)的。构造函数的参数是事件的类型,1024以下被Qt保留。其他可被程序使用。为处理定制事件类型,要重新实现customEvent()函数:
void MyLineEdit::customEvent(QCustomEvent *event)
{
if (event->type() == MyEvent) {
myEvent();
} else {
QLineEdit::customEvent(event);
}
}
QcustomEvent类有一个void *的成员,可用于特定的目的。你也可以子类化QCustomEvent,加上别的成员,但是你也需要在customEvent()中转换QCustomeEvent到你特有的类型。
- Qt的事件机制和用途
- QT的事件机制
- QT的事件机制
- QT的事件机制
- 【QT】消息机制和事件
- 浅析Qt的事件机制
- Java 反射机制的用途和缺点
- Java反射机制的原理和用途
- Qt的事件处理机制分析
- Qt的事件处理机制分析
- 剖析Qt的事件机制原理
- Qt的事件处理机制分析
- 浅议Qt的事件处理机制 二
- 浅议Qt的事件处理机制 一
- 浅议Qt的事件处理机制 一
- 浅议Qt的事件处理机制 二
- 浅议Qt的事件处理机制 一
- Qt的事件处理机制分析
- Android布局中的layout_weight和weightSum属性的详解及使用
- HDOJ 1233 还是畅通工程
- android下camera数据流的分析
- android Security Tips
- 【Usaco2015 JAN】Cow Rectangles
- Qt的事件机制和用途
- 《春日记》开发记录【4】
- 用POI获取excel表中的图片位置及数据
- 【面试】iOS 开发面试题(三)
- iOS键盘的弹出与关闭总结
- 百度前端面试题目整理
- 1.(c语言)产生随机数(rand()和srand()的配合使用)
- 《Effective C++》学习笔记——条款40
- Android Camera数据流分析全程记录(非overlay方式)