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到你特有的类型。

0 0