【引用】qt QEvent paintEvent

来源:互联网 发布:爆吧软件2016 编辑:程序博客网 时间:2024/05/18 10:55

QEvent

qt 的主消息循环QCoreApplication::exec()从消息队列中取出系统事件(system event),将它们翻译

为QEvent,并将其发送到QObject

除了用户操作引发的QEvent,还可以手动发送:QCoreApplication::sendEvent()或postEvent()

注意:QCoreApplication是QApplication的父类

接收到QEvent的QObject会调用它们对应的:***event(),这些函数一般都要被重载。

QEvent 有两个成员变量:一个事件类型和一个是否接收的标志。accept()和ignore()可以设置这个标志。

*******************************************************************************************

QObject::installEventFilter()允许一个对象截获本该发到其它对象的事件。

void QObject::installEventFilter ( QObject * filterObj )

它将一个事件过滤器安装到一个QObject中。事件过滤器接收宿主QObject的所有events,它既可以不接收,也可以将其发送到宿主QObject。事件过滤器本身也是一个QObject,它通过自己的eventFilter() 函数

来接收事件。如果该函数返回true,那么表示该事件已经被处理了,不需要调用默认的事件处理程序。反之,则交给默认事件处理程序处理。一个QObject可以安装多个事件过滤器,但最后安装的那个会最先激活。

eg:建立一个事件过滤器:

 class KeyPressEater : public QObject

     {

         Q_OBJECT

         ...

     protected:

         bool eventFilter(QObject *obj, QEvent *event);

     };

     bool KeyPressEater::eventFilter(QObject *obj, QEvent *event)

     {

         if (event->type() == QEvent::KeyPress) {

             QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);

             qDebug("Ate key press %d", keyEvent->key());

             return true;

         } else {

             // standard event processing

             return QObject::eventFilter(obj, event);

         }

     }

除此之外

EventFilter QCoreApplication::setEventFilter ( EventFilter filter )也可设定

它设置了事件过滤器,并将以前设置的过滤器返回(如果有的话)

filter这里不是一个对象,而是一个函数名,其功能和事件过滤器的eventFilter()一样。

eg:定义一个filter函数

bool myEventFilter(void *message, long *result);

***********************************************************************************

void QWidget::paintEvent ( QPaintEvent * event )

处理事件的函数也称为event handler,上面的函数可以在子类中重载以响应paint事件。

一个paint事件对应一个重绘整个窗口或部分窗口的要求,它可以在调用repaint()或update()后产生。

重绘的无效区域是QPaintEvent::region()。update在调用时会合并多个无效区域,而repaint是立即执行

重绘是在QWidget的background上进行的,可通过setBackgroundRole() 和setPalette()进行设置。

Qt4.0以上版本支持双缓存重绘,但在其它版本需要编写双缓存的实现代码。

在X11下可以调用qt_x11_set_global_double_buffer()实现。

*******qt会隔一段时间自动的调用repaint函数??

*******不要在 paintEvent()里面调用update() repaint()

*******在Qtopia 4.1.x系列里,默认情况下要使用QPainter画图必须在在paintEvent()函数里,如果在其它地方的话,运行时会提示如下错误

QPainter::begin: Widget painting can only begin as a result of a paintEvent

要避免这个问题可以设置你要画图的那个widget的一个属性,加上类似这样的代码this->setAttribute(Qt::WA_PaintOutsidePaintEvent);就可以了。

原创粉丝点击