QTimer 定时器

article/2025/9/12 17:58:52

QTimer类为我们提供了一个即可重复触发又可单次触发的定时器。它是一个高层次的应用程序接口。要使用它,只需创建一个QTimer类对象,将它的timeout()信号连接到适当的函数上,然后调用其start()函数开启定时器即可,此后,QTimer对象就会周期性的发出timeout()信号。

例如,一个1s执行一次的定时器,可以如下设置:

      QTimer *timer = new QTimer(this);connect(timer, SIGNAL(timeout()), this, SLOT(update()));timer->start(1000);
这样,update()就会每隔1秒被调用一次。

当然,我们也可以让一个QTimer对象在启动后只触发一次,只需调用该类的setSingleShot(true)即可。其实,更简单的做法是使用该类的静态方法QTimer::singleShot(),以某个时间间隔来启动一个单次触发的定时器。例如:

QTimer::singleShot(2000, this, SLOT(updateCaption()));
上面这句代码执行结束,2s后会调用一次updateCaption(),并且只调用一次。

要注意的是在多线程程序中,我们可以在任何开启了事件循环的线程中启动定时器。而要在一个非GUI线程中开启事件循环,则需要调用QThread::exec()。而Qt会使用定时器的线程依附性来决定由哪个线程发出timeout()信号。鉴于此,必须在定时器对象所在的线程中开启和结束定时器,不能跨线程操作。

比较特殊的一点是,在构建QTimer 对象时,可以传入0作为时间间隔。这样的定时器会在窗口系统的事件队列中的事件都被处理完之后触发。这可以用来在GUI程序中处理一些后台任务,比如垃圾收集。

下面我们使用QTimer类,来周期性的改变窗口的背景图片。

新建一个GUI工程Timer,完成后,在工程上点击右键,添加新文件,选中Qt Resource File,将我们需要的图片作为资源加入到工程中。如下图:



点击 Choose,在为资源文件起一个名字即可。如下图:



点击 下一步,在点击完成即可。

完成后,会在工程目录中生成一个资源目录,如下图:


然后,在res.qrc上,右键->open in editor,打开资源编辑器。如下图:


点击 添加->添加前缀,添加一个简单的前缀即可,一般在 前缀 那一栏填入"/"即可。

在点击 添加->添加文件 ,将准备好的图片添加进来即可。添加完成后,如下图:


这样,我们就可以在代码中使用这些图片了。至于Qt的资源系统,大家有时间的话可以自行参考Qt帮助文档学习,此处就不展开讲了。


先来看头文件widget.h的代码:

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTimer>namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();protected:void paintEvent(QPaintEvent*);private slots:void timeout();private:Ui::Widget *ui;QTimer* timer;QImage images[12];int index;
};#endif // WIDGET_H
在头文件中,我们先重写了paintEvent()事件,该事件就是用来重绘窗口的,我们以会就是在这个函数中向界面上绘制我们的图片。然后我们还定义了一个timeout()槽函数,该函数用来响应定时器QTimer的timeout()信号(注意,不要和上面的timeout()搞混,一个是槽,一个是信号,此处只是名字而已,大家在可以将上面的槽函数timeout()改为其他的名字)。最后,我们定义了一个定时器对象,一个QImage图片数组,用来存储我们的12张星座图片,还定义了一个index下标,用来在每次界面重绘的事件中标识不同的图片。

下面来看一个窗口的构造函数:

Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);images[0] = QImage(":/images/1.jpg");images[1] = QImage(":/images/2.jpg");images[2] = QImage(":/images/3.jpg");images[3] = QImage(":/images/4.jpg");images[4] = QImage(":/images/5.jpg");images[5] = QImage(":/images/6.jpg");images[6] = QImage(":/images/7.jpg");images[7] = QImage(":/images/8.jpg");images[8] = QImage(":/images/9.jpg");images[9] = QImage(":/images/10.jpg");images[10] = QImage(":/images/11.jpg");images[11] = QImage(":/images/12.jpg");index = 0;timer = new QTimer(this);connect(timer, SIGNAL(timeout()), this, SLOT(timeout()));timer->start(1000);
}
在构造函数中,我们先使用我们添加的资源图片初始化了我们的图片数组,注意Qt中使用资源加载图片的方式,已":"开始,后面是图片在资源文件中的具体路径。然后,将index初始化为0,即重第一张图片开始显示。最后,实例化定时器对象,连接其timeout()信号到我们定义的timeout()槽函数上,再以1s为间隔启动定时器。

timeout()槽函数实现如下:

void Widget::timeout()
{update();
}
在定时器到期函数中,我们只是简单的调用了QWidget类的update()函数,该函数会触发窗口的重绘,即会触发paintEvent()函数的调用。

paintEvent()实现如下:

void Widget::paintEvent(QPaintEvent *)
{QPainter painter(this);painter.drawImage(rect(), images[index++ % 12]);
}
在paintEvent()函数中,我们每次将下标index % 12 表示的图片绘制到窗口上,然后将index自增。从而实现12张图片的轮播。

启动程序,运行结果如下,12张星座图片以1s为间隔,不断在窗口中轮播:






http://chatgpt.dhexx.cn/article/5I0gSfmV.shtml

相关文章

QTimer使用

QTimer工作流程 程序示例 test_timee.h //继承QObject&#xff0c;使用信号/槽 class TestTimer: public QObject {Q_OBJECT public:TestTimer(QObject *parent nullptr);public slots:void start();void stop();void do1();private://定义timer对象QTimer m_timer; }; tes…

定时器QTimer

学习PyQt推荐大家看这本书&#xff1a;https://weread.qq.com/web/reader/6393267071ccfa97639f573 链接&#xff1a;https://pan.baidu.com/s/1ZuHxNvEYtUqzSWqytN7viw 提取码&#xff1a;qku8 import sys from PyQt5.QtWidgets import QApplication,QWidget from PyQt5 i…

Qt QTimer定时器

1.QTimer简介 QTimer 主要的属性是 interval&#xff0c;是定时中断的周期&#xff0c;单位毫秒。QTimer 主要的信号是 timeout()&#xff0c;在定时中断时发射此信号&#xff0c;要想在定时中断里做出响应&#xff0c;这就需要编写 timeout() 信号的槽函数。 2.常用API //设…

Qt定时器QTimer使用教程与代码演示

Qt提供了定时器类QTimer, 在使用时需要包含头文件 #include <QTimer>QTimer类方法介绍: void start(int msec); 开启定时器&#xff0c;定时间隔的msec毫秒void stop(); 结束定时 QTimer信号&#xff1a; void timeout(QPrivateSignal); 在链接定时器时&#xff0c;需…

【Qt】QTimer的简单使用

定义定时器对象&#xff1a;QTimer *myTimer; 动态分部内存空间&#xff1a;myTimer new QTimer(this); 启动定时器&#xff1a;myTimer->start(100); 定时器超时事件&#xff1a;QTimer::timeout() 停止定时器&#xff1a;myTimer->stop(); 等等&#xff1b; 程序实现功…

QT之QTimer详解以及结合多线程中开启定时器的示例

一 QTimer详解 QTimer类提供了重复和单次触发信号的定时器。 a.void timeout ()定时器超时后&#xff0c;这个信号被发射。 b.void start()开启定时器,它的重载函数void start(int msec),启动或重新启动一个超时时间间隔为毫秒的定时器,如果定时器正在运行&#xff0c;它将被停…

Qt 之 QTimer

作者&#xff1a; 一去、二三里 个人微信号&#xff1a; iwaleon 微信公众号&#xff1a; 高效程序员 QTimer类提供了重复和单次触发信号的定时器。 QTimer类为定时器提供了一个高级别的编程接口。很容易使用&#xff1a;首先&#xff0c;创建一个QTimer&#xff0c;连接timeo…

DEV、SIT、UAT、PET、SIM、PRD、PROD缩写介绍

按开发、测试、上线的时间线排序&#xff1a; DEV Development 研发环境 SIT System Integrate Test 系统集成测试环境&#xff08;内测&#xff09; UAT User Acceptance Test 用户验收测试环境 PET Performance Evaluation Test 性能评估测试环境&#xff08;压测&#xff0…

什么是SIT, UAT测试

2019独角兽企业重金招聘Python工程师标准>>> SIT测试 SIT(System Integration Testing)系统集成测试&#xff0c;也叫做集成测试&#xff0c;是软件测试的一个术语&#xff0c;在其中单独的软件模块被合并和作为一个组测试。它在单元测试以后和在系统测试之前。集成…

UAT测试和SIT测试的区别

区别如下&#xff1a; 1、UAT:终端用户集成测试&#xff0c;主要是要求用户参与进测试流程&#xff0c;并得到用户对软件的认可&#xff0c;鼓励用户自己进行测试设计和进行破坏性测试&#xff0c;充分暴露系统的设计和功能问题&#xff0c;显然&#xff0c;用户的认可和破坏性…

UT-FT-ST测试

单元测试(UT)、功能测试(FT)&#xff1a; 目的&#xff1a;1、尽量避免写的代码测试人员频繁的来找你其他地方又出问题了&#xff1b;2、提供的接口不可用&#xff1b;3、一个bug修复了引入了其他的bug或者其他用例变红了&#xff1b; 理解&#xff1a;在实现函数功能的时候编…

unittest教程__测试报告(6)

用例执行完成后&#xff0c;执行结果默认是输出在屏幕上&#xff0c;其实我们可以把结果输出到一个文件中&#xff0c;形成测试报告。 unittest自带的测试报告是文本形式的&#xff0c;如下代码&#xff1a; import unittestif __name__ __main__:# 识别指定目录下所有以tes…

Pytest 分组测试

有时候需要针对不同的测试环境跑不同的测试用例&#xff0c;如&#xff1a;冒烟测试、sit、uat、prd&#xff0c;所以给自动化测试用例做标记分组是很有必要的&#xff0c;pytest.mark 可以轻松实现这个功能。首先需要注册自定义标记。 通过使用pytest.mark帮助程序&#xff0…

冒烟测试回归测试UATSIT

在软件研发中&#xff0c;冒烟测试其实是微软首先提出来的一个概念&#xff0c;和微软一直提倡的每日build&#xff08;构建版本&#xff09;有很密切的联系。具体说&#xff0c;冒烟测试就是在每日build&#xff08;构建版本&#xff09;建立后&#xff0c;对系统的基本功能进…

使用GIT提交代码流程

安装步骤&#xff1a;双击Git-2.27.0-64-bit.exe安装 双击TortoiseGit-2.10.0.2-64bit.msi安装 代码提交一般有五个步骤: 1.查看目前代码的修改状态 2.查看代码修改内容 3.暂存需要提交的文件 4.提交已暂存的文件 5.同步到服务器 登陆复制仓库的地址然后复制到下图的Directory…

Git提交代码的流程

企业级项目git远程仓库一般是由master/test/dev三个分支构成&#xff0c;开发人员是在dev上做开发&#xff0c;当需要发布测试环境或者生产环境时管理员会把开发人员提交的代码合并到test或者master上。 开发人员git操作步骤&#xff1a; 1.git clone 把远程dev上的代码克隆到本…

傻瓜式Git提交代码流程【写给初学者】

前言 Git是程序员工作中最最常用的分布式版本控制系统&#xff0c;为的就是解决那种多人协作、多次修改的问题&#xff0c;虽说Git可以应用于各行各业&#xff0c;但是实际上还是程序员用的最多了&#xff0c;应该说是程序员的必备技能之一了&#xff0c;如果你还不会Git&…

vs2019中git提交代码的步骤

目录 前言 一、在vs2019的git界面提交代码 二、使用git命令行提交代码 总结 前言 在vs2019中使用git提交代码的步骤和一些常见问题。 一、在vs2019的git界面提交代码 1.切换到需要提交代码的分支上&#xff0c;首先更新分支。 vs2019工具栏选择Git&#xff0c;点击更新。 2.…

IDEA使用git提交代码

1.将鼠标移动到需要提交的代码文件上&#xff1b;2.右键文件夹&#xff0c;找到Git选项&#xff1b;3.进入选项中的Repository&#xff1b;4.然后点击push就可以将暂存的代码提交到 Git 服务器上。

在Idea用Git提交代码

前提是安装了Git 1、右键选择如下&#xff1a; 2、选择提交前文件、描述提交信息、提交到本地仓库&#xff0c;操作如下&#xff1a; 3、确定是否提交 4、推送远程仓库&#xff0c;右键选择如下&#xff1a;