⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨🎓。
如果觉得本文能帮到您,麻烦点个赞
👍呗!
近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支持一下呗。👍⭐️❤️
Qt5.9专栏
定期更新Qt的一些项目Demo
项目与比赛专栏
定期更新比赛的一些心得,面试项目常被问到的知识点。
QT5.9
专栏会定期更新有趣的Qt
知识
以工程为导向进行Qt5.9的学习,打捞基础。专栏中有Qt5.9学习笔记-仿Everything的的文件搜索的GUI工具,以及相关的基础知识。
最近在重新梳理一下Qt事件的基础知识,发现了一些有趣的知识点和开发的坑点,做一些笔记。
当涉及到Qt5.9事件时,事件系统是非常重要的一个主题。Qt5.9事件系统是一个强大的工具,它允许开发人员在Qt应用程序中响应和处理各种类型的事件。在本文中,我们将讨论Qt5.9事件系统的基础知识以及如何在应用程序中使用它来处理事件。
5 Qt5.9中的常见事件
- 定时器事件
- 鼠标事件
- 键盘事件
- 窗口事件
Qt5.9中的三种常见事件:定时器事件、鼠标事件和键盘事件。
5.1 定时器事件
定时器事件是指在指定的时间间隔内周期性地触发事件。在Qt中,我们可以通过继承QTimer
类来创建定时器对象。下面是一个简单的例子:
class MyTimer : public QTimer
{Q_OBJECTpublic:MyTimer(QObject *parent = nullptr) : QTimer(parent){connect(this, &QTimer::timeout, this, &MyTimer::onTimeout);start(1000);}signals:void timerSignal();private slots:void onTimeout(){emit timerSignal();}
};
在上面的代码中,我们创建了一个MyTimer
类继承自QTimer
类,并重写了QTimer
类中的timeout()
方法,即定时器事件的处理函数。在MyTimer
类的构造函数中,我们通过connect()
函数将定时器的timeout
信号连接到自定义的槽函数onTimeout()
,并将定时器的时间间隔设置为1秒。在onTimeout()
槽函数中,我们发射了一个自定义的信号timerSignal()
,以便在应用程序的其他地方使用。
5.2 鼠标事件
鼠标事件是指当用户在应用程序的窗口中移动鼠标时,会触发相应的事件。在Qt中,我们可以通过重写QWidget
类的鼠标事件处理函数来处理鼠标事件。下面是一个简单的例子:
class MyWidget : public QWidget
{Q_OBJECTpublic:MyWidget(QWidget *parent = nullptr) : QWidget(parent){setFixedSize(200, 200);}protected:void mousePressEvent(QMouseEvent *event) override{qDebug() << "Mouse Pressed:" << event->pos();}void mouseMoveEvent(QMouseEvent *event) override{qDebug() << "Mouse Moved:" << event->pos();}void mouseReleaseEvent(QMouseEvent *event) override{qDebug() << "Mouse Released:" << event->pos();}
};
在上面的代码中,我们创建了一个MyWidget
类继承自QWidget
类,并重写了QWidget
类中的三个鼠标事件处理函数:mousePressEvent()
、mouseMoveEvent()
和mouseReleaseEvent()
。在这三个函数中,我们使用qDebug()
函数输出鼠标事件的信息,例如鼠标按下、移动和释放的位置。
5.3 键盘事件
键盘事件是指当用户在应用程序的窗口中按下或释放键盘按键时,会触发相应的事件。在Qt中,我们可以通过重写QWidget
类的键盘事件处理函数来处理键盘事件。下面是一个简单的例子:
下面是完整的代码实现:
#include <QApplication>
#include <QWidget>
#include <QTimerEvent>
#include <QMouseEvent>
#include <QKeyEvent>
#include <QLabel>class MyWidget : public QWidget
{
public:MyWidget(QWidget *parent = nullptr);protected:void timerEvent(QTimerEvent *event) override;void mousePressEvent(QMouseEvent *event) override;void keyPressEvent(QKeyEvent *event) override;private:int m_timerId;QLabel *m_label;
};MyWidget::MyWidget(QWidget *parent): QWidget(parent), m_timerId(-1)
{m_label = new QLabel(this);m_label->setAlignment(Qt::AlignCenter);m_label->setText("Press the left mouse button or any key to generate events");m_label->setGeometry(10, 10, 280, 80);m_timerId = startTimer(1000);
}void MyWidget::timerEvent(QTimerEvent *event)
{if (event->timerId() == m_timerId) {m_label->setText(QString("Timer event %1").arg(QDateTime::currentDateTime().toString("hh:mm:ss")));} else {QWidget::timerEvent(event);}
}void MyWidget::mousePressEvent(QMouseEvent *event)
{if (event->button() == Qt::LeftButton) {m_label->setText("Mouse left button pressed");} else {QWidget::mousePressEvent(event);}
}void MyWidget::keyPressEvent(QKeyEvent *event)
{m_label->setText(QString("Key %1 pressed").arg(event->text()));
}int main(int argc, char *argv[])
{QApplication a(argc, argv);MyWidget w;w.show();return a.exec();
}
这个例子演示了如何在Qt中使用定时器事件、鼠标事件和键盘事件。在窗口中,我们添加了一个QLabel控件来显示事件的信息。当定时器事件发生时,标签的文本将被更新以显示当前时间。当鼠标左键按下时,标签将显示“Mouse left button pressed”。当任何键按下时,标签将显示哪个键被按下。注意,在键盘事件处理函数中,我们使用了QKeyEvent的text()函数来获取按下的键的文本。
最后,最后
如果觉得有用,麻烦三连👍⭐️❤️支持一下呀,希望这篇文章可以帮到你,你的点赞是我持续更新的动力