• Qt中QTimer定时器的用法


            Qt中提供了两种定时器的方式一种是使用Qt中的事件处理函数,另一种就是Qt中的定时器类QTimer。

            使用QTimer类,需要创建一个QTimer类对象,然后调用其start()方法开启定时器,此后QTimer对象就会周期性的发出timeout()信号。

    1.QTimer类中一些相关的API

    1.1 pulic/slot function

    1. // 构造函数
    2. // 如果指定了父对象, 创建的堆内存可以自动析构
    3. QTimer::QTimer(QObject *parent = nullptr);
    4. // 设置定时器时间间隔为 msec 毫秒
    5. // 默认值是0,一旦窗口系统事件队列中的所有事件都已经被处理完,一个时间间隔为0的QTimer就会触发
    6. void QTimer::setInterval(int msec);
    7. // 获取定时器的时间间隔, 返回值单位: 毫秒
    8. int QTimer::interval() const;
    9. // 根据指定的时间间隔启动或者重启定时器, 需要调用 setInterval() 设置时间间隔
    10. [slot] void QTimer::start();
    11. // 启动或重新启动定时器,超时间隔为msec毫秒。
    12. [slot] void QTimer::start(int msec);
    13. // 停止定时器。
    14. [slot] void QTimer::stop();
    15. // 设置定时器精度
    16. /*
    17. 参数:
    18. - Qt::PreciseTimer -> 精确的精度, 毫秒级
    19. - Qt::CoarseTimer -> 粗糙的精度, 和1毫秒的误差在5%的范围内, 默认精度
    20. - Qt::VeryCoarseTimer -> 非常粗糙的精度, 精度在1秒左右
    21. */
    22. void QTimer::setTimerType(Qt::TimerType atype);
    23. Qt::TimerType QTimer::timerType() const; // 获取当前定时器的精度
    24. // 如果定时器正在运行,返回true; 否则返回false。
    25. bool QTimer::isActive() const;
    26. // 判断定时器是否只触发一次
    27. bool QTimer::isSingleShot() const;
    28. // 设置定时器是否只触发一次, 参数为true定时器只触发一次, 为false定时器重复触发, 默认为false
    29. void QTimer::setSingleShot(bool singleShot);

     1.2 signals

            QTimer这个类的信号只有一个, 当定时器超时时,该信号就会被发射出来。给这个信号通过conect()关联一个槽函数, 就可以在槽函数中处理超时事件了

     

    1. //当定时器超时时,该信号就会发出
    2. [signal] void QTimer::timeout();

    1.3QTimer类中的静态公共函数(static public function)

    1. // 其他同名重载函数可以自己查阅帮助文档
    2. /*
    3. 功能: 在msec毫秒后发射一次信号, 并且只发射一次
    4. 参数:
    5. - msec: 在msec毫秒后发射信号
    6. - receiver: 接收信号的对象地址
    7. - method: 槽函数地址
    8. */
    9. [static] void QTimer::singleShot(
    10. int msec, const QObject *receiver,
    11. PointerToMemberFunction method);

    2.QTimer代码例子

    创建一个新工程,在mianwindow.ui文件中放入一个PushButton,并修改按钮名称和对象名称:

     

    再添加一个Label并改变对象名称,这个Label用来显示当前的时间 

    在拷贝一份PushButton和Label,修改Pushbutton和Label对象名称

     

    1. //mianwindow.cpp
    2. #include "mainwindow.h"
    3. #include "ui_mainwindow.h"
    4. #include
    5. #include
    6. MainWindow::MainWindow(QWidget *parent)
    7. : QMainWindow(parent)
    8. , ui(new Ui::MainWindow)
    9. {
    10. ui->setupUi(this);
    11. //创建定时器对象
    12. QTimer *timer = new QTimer(this);
    13. //按钮的点击事件
    14. connect(ui->loopBtn,&QPushButton::clicked, this, [=]{
    15. //启动定时器
    16. if(timer->isActive()){
    17. timer->stop(); //关闭定时器
    18. ui->loopBtn->setText("开始");
    19. }else{
    20. ui->loopBtn->setText("关闭");
    21. timer->start(1000); //开启定时器 1秒钟触发定时器信号 1000ms = 1s
    22. }
    23. });
    24. connect(timer, &QTimer::timeout, this,[=]{
    25. QTime tm = QTime::currentTime();//获取当前时间
    26. //格式化当前得到的系统时间
    27. QString tmstr = tm.toString("hh:mm:ss.zzz");
    28. //设置要显示的时间
    29. ui->curtime->setText(tmstr);
    30. });
    31. //发射一次信号
    32. connect(ui->onceBtn, &QPushButton::clicked,this,[=]{
    33. //获取2s以后的系统时间
    34. QTimer::singleShot(2000,this,[=]{
    35. QTime tm = QTime::currentTime();//获取当前时间
    36. //格式化当前得到的系统时间
    37. QString tmstr = tm.toString("hh:mm:ss.zzz");
    38. //设置要显示的时间
    39. ui->oncetime->setText(tmstr);
    40. });
    41. });
    42. }
    43. MainWindow::~MainWindow()
    44. {
    45. delete ui;
    46. }

    运行结果:

     第一个开始按钮按下,时间定时开始计时,点击关闭停止计时;

    第二个开始按钮按下,会等待2秒后才显示当前系统时间。

  • 相关阅读:
    2023-9-10 集合-Nim游戏
    【云原生之kubernetes实战】Kompose工具的安装使用
    字符设备驱动总结
    maven build An unknown compilation problem occurred
    我问老大:TCP 四次挥手,可以变成三次吗?
    带你阅读JDK1.8的HashMap源码(一)
    《操作系统-真象还原》12. 进一步完善内核
    鸿蒙小案例-动态歌词
    Spring MVC 中的数据验证技术
    python 第一次作业
  • 原文地址:https://blog.csdn.net/weixin_44954230/article/details/133678124