Qt實(shí)現(xiàn)簡(jiǎn)易秒表設(shè)計(jì)
Qt–簡(jiǎn)易秒表設(shè)計(jì)(QTimer,Qtime,TableWiget應(yīng)用),供大家參考,具體內(nèi)容如下
效果圖
使用QTimer和QTime兩個(gè)類(lèi)
思路:
1.計(jì)時(shí)功能:?
利用QTimer中的定時(shí)器中斷信號(hào),設(shè)置每10毫秒觸發(fā)一次timeout信號(hào),在對(duì)應(yīng)槽函數(shù)中對(duì)LCD number中顯示的時(shí)間進(jìn)行更新,即LCD屏中每十毫秒更新一次;對(duì)于時(shí)間的累加顯示(QTimer是定時(shí)器)需要Qtime,在每一次timeout信號(hào)出發(fā)時(shí),使Qtime類(lèi)的time累加上10ms。
部分關(guān)鍵代碼如下(代碼并非連續(xù),只說(shuō)關(guān)鍵點(diǎn),源碼在末尾):
//.h文件中添加頭文件 #include <QTimer> #include <QTime> //聲明 ? ? QTimer * m_Timer;?? ?//定時(shí)器,用來(lái)每10ms發(fā)出timeout信號(hào) ? ? QTime m_Time;?? ?//用來(lái)計(jì)時(shí) ? ? QTime showTime;?? ?//往lcd上顯示的時(shí)間 // .cpp文件里 構(gòu)造函數(shù)中進(jìn)行初始化 ? ?? ?m_Timer = new QTimer; ? ? m_Time.setHMS(0, 0, 0, 0);?? ?// //設(shè)置timeout間隔10ms ?? ?m_Timer->start(10); //每次timeout讓m_Time加10ms ?? ?connect(m_Timer, &QTimer::timeout, this, &app::updateDisplayTime); ?? ?//曹函數(shù)如下 ?? ?void app::updateDisplayTime() ? ? { ? ? ? ? m_Time = m_Time.addMSecs(10);//計(jì)時(shí)器累加10ms ? ? ? ? QString tim = m_Time.toString("mm:ss.zzz");//時(shí)間轉(zhuǎn)換為字符串 ?? ??? ? ? ? ?? ?ui->lcdNumber_Timer->display(tim.left(tim.length() - 1));//將字符串最后一個(gè)0去掉 ? ? }
時(shí)間的顯示與更新邏輯解決后,其次是如何使用***tableWiget***控件實(shí)現(xiàn)計(jì)次功能,以下簡(jiǎn)單介紹tableWiget使用與計(jì)次功能實(shí)現(xiàn):
//計(jì)次按鈕對(duì)應(yīng)的槽函數(shù) ?? ?int m_Row = 0;//行數(shù) ?? ?if(ui->pushButton_Count->text() == "計(jì)次") ? ? { ? ? ? ? QString tim = m_Time.toString("mm:ss.zzz");//獲取時(shí)間 ? ? ? ? ui->tableWidget->insertRow(m_Row);//插入行,每次點(diǎn)擊計(jì)次都需要新加入一行? ? ? ? ? //每次新增一個(gè)格子(不是一行)都需要new一個(gè)QTableWigetitem ? ? ? ? ui->tableWidget->setItem(m_Row, 0, new QTableWidgetItem(tr("#%0").arg(m_Row+1)));//0行,0列為序號(hào) ? ? ? ? ui->tableWidget->setItem(m_Row, 1, new QTableWidgetItem("計(jì)次"));//0行,1列為動(dòng)作 ? ? ? ? ui->tableWidget->setItem(m_Row, 2, new QTableWidgetItem(tim.left(tim.length() - 1)));//計(jì)次時(shí)間 ? ? ? ? m_Row++; ? ? }
2.按鍵設(shè)計(jì)
?按下開(kāi)始按鈕后,開(kāi)始按鈕變?yōu)橥V梗?按下停止后停止變?yōu)槔^續(xù)并且計(jì)次變?yōu)閺?fù)位,,主要邏輯類(lèi)似于iphone手機(jī)里的計(jì)時(shí)器,自己點(diǎn)點(diǎn)就明白了,主要是邏輯問(wèn)題,詳情見(jiàn)源碼:
3.源碼
(有很多地方可以單獨(dú)寫(xiě)成函數(shù)的,此處就先這樣吧,主要是總結(jié)思路,勿噴)
#ifndef APP_H #define APP_H #include <QWidget> #include <QTimer> #include <QTime> QT_BEGIN_NAMESPACE namespace Ui { class app; } QT_END_NAMESPACE class app : public QWidget { ? ? Q_OBJECT public: ? ? app(QWidget *parent = nullptr); ? ? ~app(); private slots: ? ? void on_pushButton_Start_clicked(); ? ? void on_pushButton_Count_clicked(); private: ? ? Ui::app *ui; ? ? QTimer * m_Timer; ? ? QTime m_Time; ? ? QTime showTime; ? ? int m_Row; public: ? ? void updateDisplayTime(); }; #endif // APP_H
#include "app.h" #include "ui_app.h" #include <QDebug> app::app(QWidget *parent) ? ? : QWidget(parent) ? ? , ui(new Ui::app) { ? ? ui->setupUi(this); ? ? m_Timer = new QTimer; ? ? m_Time.setHMS(0, 0, 0, 0); ? ? m_Row = 0; ? ? //初始化顯示 ? ? ui->lcdNumber_Timer->display("00:00.00"); ? ? QStringList Header; ? ? Header << "序號(hào)" << "動(dòng)作" << "計(jì)次"; ? ? ui->tableWidget->setColumnCount(3); ? ? ui->tableWidget->setHorizontalHeaderLabels(Header); ? ? //開(kāi)始,暫停,計(jì)次事件 ? ? connect(m_Timer, &QTimer::timeout, this, &app::updateDisplayTime); } app::~app() { ? ? delete ui; } //更新l'c'd中的時(shí)間 void app::updateDisplayTime() { ? ? qDebug() << "timeout"; ? ? QString tim = m_Time.toString("mm:ss.zzz"); ? ? m_Time = m_Time.addMSecs(10); ? ? ui->lcdNumber_Timer->display(tim.left(tim.length() - 1)); } // 開(kāi)始, 與 暫停, 判斷,如果按鈕名稱(chēng)為開(kāi)始 void app::on_pushButton_Start_clicked() { ? ? //qDebug() << "startBtn"; ? ? //啟動(dòng)定時(shí)器,并設(shè)置timeout的中斷間隔為10毫秒 ? ? if(ui->pushButton_Start->text() == "開(kāi)始") ? ?//按下時(shí)是開(kāi)始,開(kāi)始計(jì)時(shí),并且此按鍵變?yōu)橥V? ? ? { ? ? ? ? m_Timer->start(10); ? ? ? ? m_Row = 0; ? ? ? ? ui->tableWidget->clearContents(); ? ? ? ? ui->tableWidget->setRowCount(0); ? ? ? ? ui->pushButton_Start->setText("停止"); ? ? ? ? ui->pushButton_Count->setText("計(jì)次"); ? ? } ? ? else if(ui->pushButton_Start->text() == "停止") ? //按下時(shí)是停止,停止計(jì)時(shí),并且按鍵變?yōu)槔^續(xù) ? ? { ? ? ? ? ui->pushButton_Start->setText("繼續(xù)"); ? ? ? ? ui->pushButton_Count->setText("復(fù)位"); ? ? ? ? ui->tableWidget->insertRow(m_Row); ? ? ? ? ui->tableWidget->setItem(m_Row, 0, new QTableWidgetItem(tr("#%0").arg(m_Row+1))); ? ? ? ? ui->tableWidget->setItem(m_Row, 1, new QTableWidgetItem("停止")); ? ? ? ? //按鈕為停止時(shí)按下,停止時(shí)間 ? ? ? ? m_Timer->stop(); ? ? ? ? QString tim = m_Time.toString("mm:ss.zzz"); ? ? ? ? ui->tableWidget->setItem(m_Row, 2, new QTableWidgetItem(tim.left(tim.length() - 1))); ? ? ? ? m_Row++; ? ? } ? ? else if(ui->pushButton_Start->text() == "繼續(xù)") ? ? { ? ? ? ? ui->pushButton_Start->setText("停止"); ? ? ? ? ui->pushButton_Count->setText("計(jì)次"); ? ? ? ? m_Timer->start(10); ? ? } ? ? else ? ? { ? ? ? ? return; ? ? } } //計(jì)次與復(fù)位 void app::on_pushButton_Count_clicked() { ? ? if(ui->pushButton_Count->text() == "計(jì)次") ? ? { ? ? ? ? QString tim = m_Time.toString("mm:ss.zzz"); ? ? ? ? ui->tableWidget->insertRow(m_Row); ? ? ? ? ui->tableWidget->setItem(m_Row, 0, new QTableWidgetItem(tr("#%0").arg(m_Row+1))); ? ? ? ? ui->tableWidget->setItem(m_Row, 1, new QTableWidgetItem("計(jì)次")); ? ? ? ? ui->tableWidget->setItem(m_Row, 2, new QTableWidgetItem(tim.left(tim.length() - 1))); ? ? ? ? m_Row++; ? ? } ? ? else if(ui->pushButton_Count->text() == "復(fù)位") ? //復(fù)位時(shí)將另一個(gè)按鈕變?yōu)殚_(kāi)始 ? ? { ? ? ? ? m_Time.setHMS(0,0,0,0); ? ? ? ? ui->lcdNumber_Timer->display("00:00.00"); ? ? ? ? ui->pushButton_Start->setText("開(kāi)始"); ? ? } ? ? else ? ? { ? ? ? ? return; ? ? } } text() == "復(fù)位") ? //復(fù)位時(shí)將另一個(gè)按鈕變?yōu)殚_(kāi)始 ? ? { ? ? ? ? m_Time.setHMS(0,0,0,0); ? ? ? ? ui->lcdNumber_Timer->display("00:00.00"); ? ? ? ? ui->pushButton_Start->setText("開(kāi)始"); ? ? } ? ? else ? ? { ? ? ? ? return; ? ? } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
c++實(shí)現(xiàn)通用參數(shù)解析類(lèi)示例
使用命令行執(zhí)行程序的時(shí)候在程序后可跟多個(gè)參數(shù)列表,而main函數(shù)的argc和argv分別存儲(chǔ)了相關(guān)的參數(shù)個(gè)數(shù)和參數(shù)內(nèi)容,而循環(huán)輸入相關(guān)的時(shí)候就需要用戶(hù)自己來(lái)解析相關(guān)參數(shù)。以下代碼用c++的方式實(shí)現(xiàn)了相關(guān)解析的封裝,使用起來(lái)非常方便2014-03-03賭你會(huì)懵的C語(yǔ)言指針進(jìn)階數(shù)組場(chǎng)景解析
這篇文章主要為大家介紹了關(guān)于C語(yǔ)言指針進(jìn)階的示例解析,來(lái)細(xì)化指針這一部分內(nèi)容,現(xiàn)在著重把一些指針的運(yùn)用情景搬出來(lái)康康,如果對(duì)指針盤(pán)的不是非常熟練,或者指針還出于入門(mén)階段的鐵子請(qǐng)繞道2022-02-02C語(yǔ)言中求字符串長(zhǎng)度的函數(shù)的幾種實(shí)現(xiàn)方法
這篇文章主要介紹了C語(yǔ)言中求字符串長(zhǎng)度的函數(shù)的幾種實(shí)現(xiàn)方法,需要的朋友可以參考下2018-08-08基于linux下C開(kāi)發(fā)中的幾點(diǎn)技術(shù)經(jīng)驗(yàn)總結(jié)
本篇文章是對(duì)linux下C開(kāi)發(fā)中的幾點(diǎn)技術(shù)經(jīng)驗(yàn)總結(jié)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C/C++?Qt?數(shù)據(jù)庫(kù)與TreeView組件綁定詳解
本篇文章主要介紹了QT數(shù)據(jù)庫(kù)與View組件的綁定,通過(guò)數(shù)據(jù)庫(kù)與組件關(guān)聯(lián)可實(shí)現(xiàn)動(dòng)態(tài)展示數(shù)據(jù)庫(kù)中的表記錄。感興趣的小伙伴可以了解一下2021-12-12C++實(shí)現(xiàn)管理系統(tǒng)的示例代碼
這篇文章主要介紹了C++實(shí)現(xiàn)管理系統(tǒng)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10C語(yǔ)言詳細(xì)分析宏定義與預(yù)處理命令的應(yīng)用
宏定義是用宏名來(lái)表示一個(gè)字符串,在宏展開(kāi)時(shí)又以該字符串取代宏名,這只是一種簡(jiǎn)單的替換。字符串中可以含任何字符,可以是常數(shù),也可以是表達(dá)式,預(yù)處理程序?qū)λ蛔魅魏螜z查,如有錯(cuò)誤,只能在編譯已被宏展開(kāi)后的源程序時(shí)發(fā)現(xiàn)2022-07-07