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