利用QT設(shè)計(jì)秒表功能
本文實(shí)例為大家分享了QT設(shè)計(jì)秒表功能的具體代碼,供大家參考,具體內(nèi)容如下
一、窗口界面的設(shè)置
可以使用屬性欄digitCount來設(shè)計(jì)此時(shí)0的初始位置

二、代碼的編寫
1、確定時(shí)間->每間隔一秒調(diào)用一個(gè)update函數(shù)(進(jìn)行換算)或者直接調(diào)用QT里面的time類;
2、確定顯示的方式;
3、每間隔一段時(shí)間調(diào)用顯示來達(dá)到動(dòng)態(tài)效果;
4、這里應(yīng)該查看Qtime/Qlcd的help手冊(cè)
5、在對(duì)定時(shí)器聲明時(shí)要注意需要聲明成指針,后面的槽函數(shù)發(fā)出信號(hào)者要求是指針類型;
6、利用基準(zhǔn)時(shí)間與當(dāng)前時(shí)間的差值來顯示計(jì)時(shí)器;
7、設(shè)置暫停鍵的時(shí)候需要注意的是,可以給按鍵設(shè)置兩個(gè)功能,分別是暫停和繼續(xù)形成一個(gè)循環(huán),但是需要注意是,當(dāng)我們暫停后再繼續(xù)這段時(shí)間也是計(jì)算在內(nèi)的,當(dāng)再次顯示的時(shí)候,這時(shí)將會(huì)出現(xiàn)跳躍,這是因?yàn)槲覀冿@示時(shí)間的時(shí)候用的是當(dāng)前時(shí)間與基準(zhǔn)時(shí)間的差值來計(jì)算的。解決的辦法是:
獲取暫停前和暫停后的值,保存下來,當(dāng)再次開始計(jì)算時(shí)減去這部分時(shí)間即可。
8、還有注意設(shè)置每個(gè)按鍵的可用性(Enabled)

代碼如下:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <Qtimer>
#include <Qtime>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
? ? Q_OBJECT
public:
? ? explicit MainWindow(QWidget *parent = 0);
? ? ~MainWindow();
private slots:
? ? void updateTimeAndDisplay(); ? ?//槽函數(shù)
? ? void on_btn_start_clicked();
? ? void on_btn_stop_clicked();
? ? void on_btn_pause_clicked();
? ? void on_btn_log_clicked();
private:
? ? Ui::MainWindow *ui;
? ? QTimer *qtimer; ? ? ? ? ? ? ? ? //聲明一個(gè)定時(shí)器對(duì)象,聲明成指針對(duì)象
? ? QTime baseTime; ? ? ? ? ? ? ? ? //聲明一個(gè)時(shí)間對(duì)象
? ? QString showStr; ? ? ? ? ? ? ? ?//直接聲明
};
#endif // MAINWINDOW_H#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>
MainWindow::MainWindow(QWidget *parent) :
? ? QMainWindow(parent),
? ? ui(new Ui::MainWindow)
{
? ? ui->setupUi(this);
? ? this->qtimer = new QTimer; ? //實(shí)例構(gòu)造
? ? connect(this->qtimer,SIGNAL(timeout()),this,SLOT(updateTimeAndDisplay()));
}
MainWindow::~MainWindow()
{
? ? delete ui;
}
//計(jì)算基準(zhǔn)時(shí)間和當(dāng)前時(shí)間的差值來顯示秒表值(currentTime)
void MainWindow::updateTimeAndDisplay()
{
? ? QTime current = QTime::currentTime();
? ? int temp = this->baseTime.msecsTo(current); ? //計(jì)算差值
? ? QTime showTime(0,0,0,0);
? ? showTime = showTime.addMSecs(temp);
? ? showStr = showTime.toString("hh:mm:ss:zzz"); ?//時(shí)間轉(zhuǎn)換為字符串
? ? this->ui->lcdNumber->display(showStr);
}
void MainWindow::on_btn_start_clicked()
{
? ? this->baseTime = QTime::currentTime();
? ? this->qtimer->start(1);
? ? this->ui->btn_start->setEnabled(false); ? ?//設(shè)置按鍵的可用性
}
void MainWindow::on_btn_stop_clicked()
{
? ? if(this->ui->btn_stop->text() == "停止"){
? ? ? ? this->ui->btn_stop->setText("清零");
? ? ? ? this->qtimer->stop();
? ? ? ? this->ui->btn_start->setEnabled(false);
? ? ? ? this->ui->btn_pause->setEnabled(false);
? ? }else
? ? {
? ? ? ? this->ui->lcdNumber->display("00:00:00:000");
? ? ? ? this->ui->textBrowser->clear();
? ? ? ? this->ui->btn_stop->setText("停止");
? ? ? ? this->ui->btn_start->setEnabled(true);
? ? ? ? this->ui->btn_pause->setEnabled(true);
? ? }
}
//獲取暫停前后的值求差值
void MainWindow::on_btn_pause_clicked()
{
? ? static QTime pauseTime;
? ? if(this->ui->btn_pause->text() == "暫停"){
? ? ? ? pauseTime = QTime::currentTime();
? ? ? ? this->qtimer->stop();
? ? ? ? this->ui->btn_pause->setText("繼續(xù)");
? ? ? ? this->ui->btn_start->setEnabled(false);
? ? ? ? this->ui->btn_stop->setEnabled(false);
? ? }else
? ? {
? ? ? ? QTime cut = QTime::currentTime();
? ? ? ? int t = pauseTime.msecsTo(cut); ? ? ? ? //求差值
? ? ? ? this->baseTime = baseTime.addMSecs(t); ?//把暫停時(shí)間再給baseTime
? ? ? ? this->qtimer->start(1);
? ? ? ? this->ui->btn_pause->setText("暫停");
? ? ? ? this->ui->btn_start->setEnabled(true);
? ? ? ? this->ui->btn_stop->setEnabled(true);
? ? }
}
void MainWindow::on_btn_log_clicked()
{
? ? this->ui->textBrowser->append(showStr); //這里如果使用settext()將會(huì)覆蓋信息,不能追加顯示
}以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
一篇文章帶你了解C語言文件操作中的幾個(gè)函數(shù)
這篇文章主要介紹了使用C語言操作文件的基本函數(shù)整理,包括創(chuàng)建和打開以及關(guān)閉文件的操作方法,需要的朋友可以參考下,希望能夠給你帶來幫助2021-09-09
數(shù)據(jù)結(jié)構(gòu) 雙向鏈表的創(chuàng)建和讀取詳解及實(shí)例代碼
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu) 雙向鏈表的創(chuàng)建和讀取詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-03-03
VsCode搭建C語言運(yùn)行環(huán)境詳細(xì)過程及終端亂碼問題解決方案
這篇文章主要介紹了VsCode搭建C語言運(yùn)行環(huán)境以及終端亂碼問題解決,在VsCode中搭建C/C++運(yùn)行環(huán)境需要先安裝幾個(gè)插件,具體插件文中給大家詳細(xì)介紹,需要的朋友可以參考下2022-12-12
標(biāo)準(zhǔn)CSV格式的介紹和分析以及解析算法實(shí)例詳解
這篇文章主要介紹了標(biāo)準(zhǔn)CSV格式的介紹和分析以及解析算法實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12
C++中typedef 及其與struct的結(jié)合使用
這篇文章主要介紹了C++中typedef 及其與struct的結(jié)合使用,需要的朋友可以參考下2014-02-02
C/C++通過HTTP實(shí)現(xiàn)文件上傳與下載的示例詳解
WinInet是 Microsoft Windows 操作系統(tǒng)中的一個(gè) API 集,用于提供對(duì) Internet 相關(guān)功能的支持,它包括了一系列的函數(shù),使得 Windows 應(yīng)用程序能夠進(jìn)行網(wǎng)絡(luò)通信、處理 HTTP 請(qǐng)求、FTP 操作等,本文給大家介紹了C/C++通過HTTP實(shí)現(xiàn)文件上傳與下載,需要的朋友可以參考下2023-12-12
C語言實(shí)現(xiàn)撲克牌計(jì)算24點(diǎn)
這篇文章主要為大家詳細(xì)介紹了C語言如何實(shí)現(xiàn)撲克牌計(jì)算24點(diǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10

