概述
Qt 的事件处理,实际上是有五个层次:
1. 重写paintEvent()、mouseXXXEvent()等事件处理函数。这是最普通、最简单的形式,同时功能也最简单。
2. 重写event()函数。event()函数是所有对象的事件入口,QObject和QWidget中的实现,默认是把事件传递给特定的事件处理函数。
3. 在特定对象上面安装事件过滤器。该过滤器仅过滤该对象接收到的事件。
4. 在QCoreApplication::instance()上面安装事件过滤器。该过滤器将过滤所有对象的所有事件,因此和notify()函数一样强大,但是它更灵活,因为可以安装多个过滤器。全局的事件过滤器可以看到 disabled 组件上面发出的鼠标事件。全局过滤器有一个问题:只能用在主线程。
5. 重写QCoreApplication::notify()函数。这是最强大的,和全局事件过滤器一样提供完全控制,并且不受线程的限制。但是全局范围内只能有一个被使用(因为QCoreApplication是单例的)
示例如下:
mainwindow.cpp 内容
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMouseEvent>
#include <QDebug>
class Widget : public QWidget
{
public:
Widget()
{
installEventFilter(this);
}
bool eventFilter(QObject *watched, QEvent *event)
{
if (watched == this)
{
if (event->type() == QEvent::MouseButtonPress)
{
qDebug() << "2 eventFilter";
}
}
return false;
}
protected:
void mousePressEvent(QMouseEvent *)
{
qDebug() << "4 mousePressEvent";
}
bool event(QEvent *e)
{
if (e->type() == QEvent::MouseButtonPress)
{
qDebug() << "3 event";
}
return QWidget::event(e);
}
};
class EventFilter : public QObject
{
public:
EventFilter(QObject *watched, QObject *parent = 0) : QObject(parent), m_watched(watched) { }
bool eventFilter(QObject *watched, QEvent *event)
{
if (watched == m_watched)
{
if (event->type() == QEvent::MouseButtonPress)
{
qDebug() << "1 QApplication::eventFilter";
}
}
return false;
}
private:
QObject *m_watched;
};
#endif // MAINWINDOW_H
mainwindow.h内容
#include "mainwindow.h"
main.cpp 内容
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
a.installEventFilter(new EventFilter(&w, &w));
w.show();
return a.exec();
}
运行结果:
Starting D:QtWorkSpaceA_TestQEventQEventLayer_Test_12345_Goodbuild-QEventLayer_Test_12345_Good-Desktop_Qt_5_8_0_MinGW_32bit-DebugdebugQEventLayer_Test_12345_Good.exe...
1 QApplication::eventFilter
2 eventFilter
3 event
4 mousePressEvent
最后
以上就是碧蓝外套为你收集整理的Qt事件处理的顺序的全部内容,希望文章能够帮你解决Qt事件处理的顺序所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复