最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt定時(shí)器類QTimer使用詳解與注意事項(xiàng)

 更新時(shí)間:2023年10月07日 16:19:59   作者:小梁今天敲代碼了嗎  
Qt提供了兩種定時(shí)器,一種是QObject類的定時(shí)器,另一種是QTimer類的定時(shí)器,這篇文章主要給大家介紹了關(guān)于Qt定時(shí)器類QTimer使用與注意事項(xiàng)的相關(guān)資料,需要的朋友可以參考下

前言

Qt定時(shí)器類QTimer是一個用于重復(fù)執(zhí)行或延遲執(zhí)行函數(shù)的類。它可以在一定時(shí)間間隔內(nèi)發(fā)送一個信號,也可以在指定的時(shí)間后發(fā)送一個信號。QTimer是一個基于事件的定時(shí)器,即它使用Qt的事件循環(huán)來觸發(fā)定時(shí)器事件。

要使用它,只需創(chuàng)建一個QTimer類對象,然后調(diào)用其  start()  函數(shù)開啟定時(shí)器,此后QTimer對象就會周期性的發(fā)出  timeout()  信號。我們先來了解一下這個類的相關(guān)API。

以下是QTimer常用的函數(shù):

QTimer(int interval, QObject * parent = nullptr)//構(gòu)造函數(shù),創(chuàng)建一個新的QTimer對象,間隔時(shí)間由`interval`指定。`parent`參數(shù)可以設(shè)置QObject的父對象。
start(int msec = 0)// 啟動or重新啟動計(jì)時(shí)器。
stop()// 停止計(jì)時(shí)器。
setInterval(int interval)// 設(shè)置計(jì)時(shí)間隔。
setSingleShot(bool singleShot)// 設(shè)置計(jì)時(shí)器方式,若參數(shù)`singleShot`為`true`,則定時(shí)器只會在定時(shí)時(shí)間間隔到達(dá)時(shí)發(fā)出一次timeout()信號,否則定時(shí)器會一直重復(fù)發(fā)出timeout()信號。
timerId() const// 返回此計(jì)時(shí)器的標(biāo)識符。
isActive() const// 返回計(jì)時(shí)器是否處于活動狀態(tài)。

public/slot function

// 構(gòu)造函數(shù)
// 如果指定了父對象, 創(chuàng)建的堆內(nèi)存可以自動析構(gòu)
QTimer::QTimer(QObject *parent = nullptr);
// 設(shè)置定時(shí)器時(shí)間間隔為 msec 毫秒
// 默認(rèn)值是0,一旦窗口系統(tǒng)事件隊(duì)列中的所有事件都已經(jīng)被處理完,一個時(shí)間間隔為0的QTimer就會觸發(fā)
void QTimer::setInterval(int msec);
// 獲取定時(shí)器的時(shí)間間隔, 返回值單位: 毫秒
int QTimer::interval() const;
// 根據(jù)指定的時(shí)間間隔啟動或者重啟定時(shí)器, 需要調(diào)用 setInterval() 設(shè)置時(shí)間間隔
[slot] void QTimer::start();
// 啟動或重新啟動定時(shí)器,超時(shí)間隔為msec毫秒。
[slot] void QTimer::start(int msec);
// 停止定時(shí)器。
[slot] void QTimer::stop();
// 設(shè)置定時(shí)器精度
/*
參數(shù): 
    - Qt::PreciseTimer -> 精確的精度, 毫秒級
    - Qt::CoarseTimer  -> 粗糙的精度, 和1毫秒的誤差在5%的范圍內(nèi), 默認(rèn)精度
    - Qt::VeryCoarseTimer -> 非常粗糙的精度, 精度在1秒左右
*/
void QTimer::setTimerType(Qt::TimerType atype);
Qt::TimerType QTimer::timerType() const;	// 獲取當(dāng)前定時(shí)器的精度
// 如果定時(shí)器正在運(yùn)行,返回true; 否則返回false。
bool QTimer::isActive() const;
// 判斷定時(shí)器是否只觸發(fā)一次
bool QTimer::isSingleShot() const;
// 設(shè)置定時(shí)器是否只觸發(fā)一次, 參數(shù)為true定時(shí)器只觸發(fā)一次, 為false定時(shí)器重復(fù)觸發(fā), 默認(rèn)為false
void QTimer::setSingleShot(bool singleShot);

signals

這個類的信號只有一個, 當(dāng)定時(shí)器超時(shí)時(shí),該信號就會被發(fā)射出來。給這個信號通過 conect() 關(guān)聯(lián)一個槽函數(shù), 就可以在槽函數(shù)中處理超時(shí)事件了。

[signal] void QTimer::timeout();

static public function

/*
功能: 在msec毫秒后發(fā)射一次信號, 并且只發(fā)射一次
參數(shù):
	- msec:     在msec毫秒后發(fā)射信號
	- receiver: 接收信號的對象地址
	- method:   槽函數(shù)地址
*/
[static] void QTimer::singleShot(
        int msec, const QObject *receiver, 
        PointerToMemberFunction method);

示例(獲取系統(tǒng)時(shí)間并且將其顯示到窗口中):

創(chuàng)建名為QTimerTest的項(xiàng)目,在mainwindow.ui文件中創(chuàng)建兩個按鈕和兩個label

上面的“開始計(jì)時(shí)”按鈕點(diǎn)擊之后,在TextLabel中顯示動態(tài)時(shí)間,下面的“開始計(jì)時(shí)”按鈕點(diǎn)擊之后,只獲取一次當(dāng)前時(shí)間。

 mainwindow.cpp代碼如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTime>
#include <QTimer>
#include <QDebug>
    MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //創(chuàng)建定時(shí)器對象
    QTimer* timer = new QTimer(this);
    //修改定時(shí)器精度
    //timer->setTimerType(QTimer::PreciseTimer);
    //按鈕的點(diǎn)擊事件
    connect(ui->loopBtn,&QPushButton::clicked,this,[=]()
            {
                //啟動定時(shí)器
                if(timer->isActive())
                {
                    timer->stop();//關(guān)閉定時(shí)器
                    ui->loopBtn->setText("開始");
                }
                else
                {
                    ui->loopBtn->setText("關(guān)閉");
                    timer->start(1000);//1000ms == 1s
                }
            } );
    connect(timer,&QTimer::timeout,this,[=]()
            {
                QTime tm = QTime::currentTime();
                //格式化當(dāng)前得到的系統(tǒng)時(shí)間
                QString tmstr = tm.toString("hh:mm:ss.zzz");
                //設(shè)置要顯示的時(shí)間
                ui->curTime->setText(tmstr);
            });
    //發(fā)射一次信號
    connect(ui->onceBtn,&QPushButton::clicked,this,[=]()
            {
                //獲取2s以后的系統(tǒng)時(shí)間
        QTimer::singleShot(2000,this,[=]()
                {
                    QTime tm = QTime::currentTime();
                    //格式化當(dāng)前得到的系統(tǒng)時(shí)間
                    QString tmstr = tm.toString("hh:mm:ss.zzz");
                    //設(shè)置要顯示的時(shí)間
                    ui->onceTime->setText(tmstr);
                });
            });
}
MainWindow::~MainWindow()
{
    delete ui;
}

運(yùn)行結(jié)果:

示例主要代碼(每間隔一秒向控制臺發(fā)送一條消息):

    //每間隔一秒向控制臺發(fā)送一條信息
    connect(timer, &QTimer::timeout, this, [=]() {
        qDebug() << "This is the QTimer test!";
    });
    timer->start(1000);

上述代碼運(yùn)行結(jié)果: 

注意事項(xiàng):

1. 由于QTimer并不保證定時(shí)器事件的嚴(yán)格準(zhǔn)確性,因此使用QTimer的應(yīng)用程序不應(yīng)該把定時(shí)器事件作為實(shí)時(shí)信號事件來處理。 如果QTimer在Linux上運(yùn)行,那么通常會出現(xiàn)最多或少數(shù)幾毫秒的時(shí)間誤差,這與其他應(yīng)用程序的運(yùn)行和負(fù)載同時(shí)影響。 QObject類提供了一個`timerEvent()`函數(shù),可以實(shí)現(xiàn)更精確的計(jì)時(shí)器。

2. 在大多數(shù)情況下,建議將定時(shí)器連接到QObject::startTimer()函數(shù),并在哪里實(shí)現(xiàn)`timerEvent()`事件,這種方式能夠避免多個計(jì)時(shí)器事件同時(shí)達(dá)到時(shí)可能引起的不穩(wěn)定現(xiàn)象。另外要保證在計(jì)時(shí)器事件實(shí)現(xiàn)中,響應(yīng)時(shí)間足夠的短并且不會由于事件的阻塞導(dǎo)致主事件循環(huán)的失調(diào)。

3. QTimer的運(yùn)行可能會占用系統(tǒng)大量資源,如果過于頻繁的使用定時(shí)器,會導(dǎo)致程序變得緩慢或崩潰,因此應(yīng)該根據(jù)需要慎重使用。定時(shí)器的使用通常用于UI界面、后臺定時(shí)任務(wù)等場景。

4. 如果QTimer的間隔設(shè)置過小,也可能會出現(xiàn)定時(shí)器的不穩(wěn)定性,所以在應(yīng)用程序需要精細(xì)定時(shí)的情況下,應(yīng)小心使用QTimer。

總的來說,定時(shí)任務(wù)雖然簡單,但是要注意細(xì)節(jié),做好異常處理。

總結(jié)

到此這篇關(guān)于Qt定時(shí)器類QTimer使用詳解與注意事項(xiàng)的文章就介紹到這了,更多相關(guān)Qt定時(shí)器類QTimer內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C數(shù)據(jù)結(jié)構(gòu)之單鏈表詳細(xì)示例分析

    C數(shù)據(jù)結(jié)構(gòu)之單鏈表詳細(xì)示例分析

    以下是對C語言中的單鏈表進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-08-08
  • C語言模擬實(shí)現(xiàn)memmove的示例代碼

    C語言模擬實(shí)現(xiàn)memmove的示例代碼

    memmove函數(shù)用于拷貝字節(jié),如果目標(biāo)區(qū)域和源區(qū)域有重疊的話,memmove能夠保證源串在被覆蓋之前將重疊區(qū)域的字節(jié)拷貝到目標(biāo)區(qū)域中,但復(fù)制后源內(nèi)容會被更改。本文主要介紹了C語言模擬實(shí)現(xiàn)memmove的示例代碼,需要的可以參考一下
    2022-12-12
  • C語言求逆矩陣案例詳解

    C語言求逆矩陣案例詳解

    這篇文章主要介紹了C語言求逆矩陣案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Opencv獲取身份證號碼區(qū)域的示例代碼

    Opencv獲取身份證號碼區(qū)域的示例代碼

    這篇文章主要介紹了Opencv獲取身份證號碼區(qū)域的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • 優(yōu)秀程序員必須知道的20個位運(yùn)算技巧

    優(yōu)秀程序員必須知道的20個位運(yùn)算技巧

    掌握簡單的位運(yùn)算技巧還是必要的,所以今天寫這篇文章把我積累的一些位運(yùn)算技巧分享給大家,這些技巧不會是如求“1的數(shù)目”的技巧,是最基本的一行位運(yùn)算技巧
    2013-09-09
  • C語言實(shí)現(xiàn)掃雷小游戲(擴(kuò)展版可選擇游戲難度)

    C語言實(shí)現(xiàn)掃雷小游戲(擴(kuò)展版可選擇游戲難度)

    游戲目標(biāo)是找出所有沒有地雷的方格,完成游戲;要是按了有地雷的方格,游戲失??;玩家可標(biāo)記雷的位置,游戲以完成時(shí)間來評高低,并且用戶可以選擇游戲難度
    2019-10-10
  • C語言函數(shù)調(diào)用的三種實(shí)現(xiàn)方法實(shí)例

    C語言函數(shù)調(diào)用的三種實(shí)現(xiàn)方法實(shí)例

    C語言中函數(shù)的調(diào)用主要有如下三種方法,直接調(diào)用,函數(shù)指針調(diào)用,函數(shù)指針傳遞調(diào)用其中后兩種本質(zhì)一樣,但在有無返回值時(shí)還稍有差別,下面這篇文章主要給大家介紹了關(guān)于C語言函數(shù)調(diào)用的三種實(shí)現(xiàn)方法,需要的朋友可以參考下
    2022-01-01
  • 關(guān)于C++友元類的實(shí)現(xiàn)講解

    關(guān)于C++友元類的實(shí)現(xiàn)講解

    今天小編就為大家分享一篇關(guān)于關(guān)于C++友元類的實(shí)現(xiàn)講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C/C++ 動態(tài)數(shù)組的創(chuàng)建的實(shí)例詳解

    C/C++ 動態(tài)數(shù)組的創(chuàng)建的實(shí)例詳解

    這篇文章主要介紹了C/C++ 動態(tài)數(shù)組的創(chuàng)建的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握這樣的功能,需要的朋友可以參考下
    2017-10-10
  • C++類成員函數(shù)作為回調(diào)函數(shù)的實(shí)現(xiàn)與實(shí)踐

    C++類成員函數(shù)作為回調(diào)函數(shù)的實(shí)現(xiàn)與實(shí)踐

    本文主要介紹了C++類成員函數(shù)作為回調(diào)函數(shù)的實(shí)現(xiàn)與實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-01-01

最新評論

黑水县| 平顶山市| 米脂县| 武夷山市| 潍坊市| 麻城市| 凤阳县| 兴安县| 永顺县| 麦盖提县| 泰兴市| 越西县| 沙洋县| 界首市| 喀什市| 象州县| 本溪| 乐陵市| 长宁县| 大余县| 齐河县| 福安市| 太保市| 阳原县| 达孜县| 三原县| 伊金霍洛旗| 阳原县| 田阳县| 武威市| 罗甸县| 郎溪县| 锦屏县| 科技| 平果县| 延边| 柘荣县| 苍溪县| 金川县| 韩城市| 米泉市|