Qt5.9学习笔记-事件(一)
⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨🎓。
如果觉得本文能帮到您,麻烦点个赞
👍呗!
近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支持一下呗。👍⭐️❤️
Qt5.9专栏
定期更新Qt的一些项目Demo
项目与比赛专栏
定期更新比赛的一些心得,面试项目常被问到的知识点。
QT5.9
专栏会定期更新有趣的Qt
知识
以工程为导向进行Qt5.9的学习,打捞基础。专栏中有Qt5.9学习笔记-仿Everything的的文件搜索的GUI工具,以及相关的基础知识。
最近在重新梳理一下Qt事件的基础知识,发现了一些有趣的知识点和开发的坑点,做一些笔记。
当涉及到Qt5.9事件时,事件系统是非常重要的一个主题。Qt5.9事件系统是一个强大的工具,它允许开发人员在Qt应用程序中响应和处理各种类型的事件。在本文中,我们将讨论Qt5.9事件系统的基础知识以及如何在应用程序中使用它来处理事件。
目录
- 长文大纲:
- 1. 事件系统基础介绍
- 1.1 事件和事件处理的定义
- 1.2 事件的种类和分类
- 1.3 事件循环
- 2. Qt5.9中的事件处理
- 2.1 事件过滤器
- 2.2 事件处理函数
- 2.3 事件分发和派发
长文大纲:
- 事件系统基础介绍
- 事件和事件处理的定义
- 事件的种类和分类
- 事件循环
- Qt5.9中的事件处理
- 事件过滤器
- 事件处理函数
- 事件分发和派发
- 自定义事件
- 创建自定义事件
- 发送和处理自定义事件
- 使用自定义事件来扩展Qt应用程序
- 多线程和事件
- 理解多线程和事件处理
- 跨线程事件的发送和处理
- Qt5.9中的常见事件
- 定时器事件
- 鼠标事件
- 键盘事件
- 窗口事件
- 事件调试和排查
- 调试事件处理
- 查找事件相关问题的技巧
1. 事件系统基础介绍
1.1 事件和事件处理的定义
在Qt5.9中,事件是指在应用程序中发生的事情。这些事件可以来自操作系统或其他应用程序组件,如鼠标或键盘输入、定时器事件等。事件处理是指在Qt5.9应用程序中对这些事件进行响应和处理的机制。
1.2 事件的种类和分类
在Qt5.9中,事件可以分为以下几类:
- QEvent: 基本事件类,所有其他事件类都派生自QEvent。
- QInputEvent: 鼠标、键盘等输入事件类。
- QWheelEvent: 鼠标滚轮事件类。
- QFocusEvent: 焦点事件类。
- QTimerEvent: 定时器事件类。
- QResizeEvent: 窗口大小调整事件类。
- QCloseEvent: 关闭事件类。
- QPaintEvent: 绘制事件类。
1.3 事件循环
事件循环是Qt5.9中的核心机制之一,用于处理事件并响应应用程序的输入。在Qt5.9中,事件循环会不断地从系统事件队列中获取事件并将其派发到应用程序中的事件接收者(即QObject派生类对象)中。
Qt的事件循环是一个核心机制,用于在应用程序中处理各种类型的事件。事件循环不断地从系统事件队列中获取事件并将其派发到应用程序中的事件接收者(即QObject派生类对象)中,以便响应应用程序的输入。
事件循环在Qt中非常重要,因为它允许应用程序以一种非阻塞的方式响应用户输入。事件循环的运行方式通常是在应用程序启动时自动启动,并在应用程序关闭时自动停止。
以下是一个简单的例子,演示了如何在Qt中使用事件循环:
cppCopy code#include <QApplication>
#include <QLabel>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QLabel label("Hello, world!");
label.show();
return app.exec(); // 启动事件循环
}
在这个例子中,我们创建了一个应用程序并在应用程序中创建了一个QLabel对象。我们将该对象显示在屏幕上,然后通过调用QApplication::exec()函数来启动事件循环。
当应用程序启动时,事件循环将开始运行。在事件循环运行期间,任何用户输入(如鼠标或键盘事件)都会被放入系统事件队列中,然后被事件循环处理。在这个例子中,我们使用了一个非常简单的应用程序,但在更复杂的应用程序中,事件循环通常是应用程序中最重要的部分之一。
需要注意的是,Qt的事件循环通常是由QApplication对象来管理的,因此在使用Qt时,通常需要创建一个QApplication对象并通过它来启动事件循环。
希望这个例子能够帮助你更好地理解Qt的事件循环。
2. Qt5.9中的事件处理
2.1 事件过滤器
事件过滤器是一种机制,它允许在事件到达目标对象之前对其进行拦截和处理。在Qt5.9中,可以通过QObject::installEventFilter()函数来为一个对象安装事件过滤器。事件过滤器需要实现QObject::eventFilter()函数,该函数将在事件到达目标对象之前被调用。
Qt5.9的事件过滤器是一种机制,用于在Qt应用程序中拦截和处理事件。它可以让我们在事件传递到目标对象之前截获事件并执行一些自定义操作,例如修改事件、记录事件、阻止事件等。
事件过滤器可以应用于任何QObject派生类对象,并通过重载QObject::eventFilter()函数来实现自定义的事件处理逻辑。事件过滤器通常被用来增强Qt应用程序的交互性、改善用户体验以及实现一些高级的功能。
以下是一个简单的例子,演示了如何在Qt中使用事件过滤器:
#include <QApplication>
#include <QPushButton>
#include <QLabel>
#include <QEvent>
#include <QDebug>
class MyEventFilter : public QObject
{
public:
bool eventFilter(QObject* obj, QEvent* event) override
{
if (event->type() == QEvent::MouseButtonPress)
{
qDebug() << "Mouse button pressed!";
return true; // 拦截事件
}
return QObject::eventFilter(obj, event);
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPushButton button("Click me");
MyEventFilter filter;
button.installEventFilter(&filter); // 安装事件过滤器
QLabel label("Hello, world!");
label.show();
return app.exec();
}
在这个例子中,我们创建了一个QPushButton
对象,并为其安装了一个事件过滤器MyEventFilter
。在事件过滤器的eventFilter()
函数中,我们检查事件的类型是否为QEvent::MouseButtonPress
(鼠标按钮按下),如果是,则打印一条消息并返回true,表示拦截了事件。否则,我们调用了父类的eventFilter()
函数,继续将事件传递到目标对象中。
通过安装事件过滤器,我们可以拦截和处理按钮的所有事件,包括鼠标事件和键盘事件等。在这个例子中,我们只处理了鼠标按钮按下的事件,并打印了一条消息。如果我们想要拦截并处理其他类型的事件,只需要在eventFilter()函数中进行相应的处理即可。
总的来说,事件过滤器在Qt应用程序中有很多应用场景,例如捕获和处理快捷键、记录用户操作、实现拖放等。它可以让我们更加灵活地控制和定制Qt应用程序的事件处理逻辑。
2.2 事件处理函数
事件处理函数是指为一个对象实现的用于处理特定事件的函数。在Qt5.9中,可以为QObject
派生类对象实现特定事件的处理函数,例如:
cppCopy codevoid MyWidget::mousePressEvent(QMouseEvent* event)
{
// 处理鼠标按下事件
}
2.3 事件分发和派发
简单来说,就是当操作系统接收到事件并将其传递给Qt应用程序时,Qt框架会将该事件封装成QEvent对象,并将其插入到事件队列中。事件分发机制会不断从事件队列中取出事件,并将其分发到正确的QObject派生类对象中进行处理。
#include <QApplication>
#include <QWidget>
#include <QKeyEvent>
class MyWidget : public QWidget
{
public:
MyWidget(QWidget *parent = nullptr) : QWidget(parent)
{
setWindowTitle("My Widget");
setFixedSize(300, 200);
}
protected:
void keyPressEvent(QKeyEvent *event) override
{
if (event->key() == Qt::Key_Escape)
qApp->quit();
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyWidget w;
w.show();
return app.exec();
}
在上面的代码中,我们定义了一个MyWidget
类,它继承自QWidget。在MyWidget类中,我们重载了keyPressEvent()函数,该函数用于处理键盘事件。如果用户按下了Esc键,则我们调用qApp->quit()函数来退出应用程序。
在main()函数中,我们创建了一个QApplication
对象,并创建了一个MyWidget对象并显示出来。当用户在MyWidget对象中按下键盘时,该事件将被传递给操作系统,并由操作系统将其发送到Qt
应用程序的事件队列中。事件分发机制会不断从事件队列中取出事件,并将其分发到正确的QObject派生类对象中进行处理。在本例中,当键盘事件被分发到MyWidget
对象时,MyWidget对象的keyPressEvent()函数会被调用,从而完成了事件的处理。
小结:事件分发和派发是指在Qt5.9中将事件发送到目标对象并处理它的过程。事件分发是指事件循环从系统事件队列中获取事件并将其分发到目标对象。事件派发是指目标对象的事件处理函数被调用来处理特定的事件。
最后,最后
如果觉得有用,麻烦三连👍⭐️❤️支持一下呀,希望这篇文章可以帮到你,你的点赞是我持续更新的动力