首先新建工程,Ctrl +N ->Application(Qt) ->Qt Widgets Application ,然后进入设置界面,名称和路径随意就好;Build System不考虑性能用qmake 比较简单;剩下的采用默认选项就行。
初始化结束后,其项目文件组织如下
Timer.pro 此为工程文件Headers 用于存放头文件的目录Sources 用于存放源代码Forms 用于存放.ui 文件,即界面设计文件
双击Forms 下面的mainwindow.ui 文件,进入图形化的UI编辑界面,左侧为各种控件,中间为程序设计的主窗口。由于一个计时器不需要太大的尺寸,故而可以直接拖动窗口右下角的三个点,更改其尺寸。也可以定位到右侧属性栏的geometry ,展开后将宽度和高度分别设为400 和200 。
然后,将左侧Buttons 下面的Push Button 拖动到主窗口,然后在右侧可看到Push Button 的各种属性。将QObject 中的objectName 改为pbStart ;将QAbstractButton 下的text 改为start 。一会儿用于开始计时。
在左侧搜索LCD ,将LCD Number 拖动到主窗口,将名字改为Timer ,用于显示时间。
此时,我们最左侧的选项卡选中的是第三个设计 ,若点击第二个编辑 ,则可直接编辑窗口设计文件mainWindow.ui ,然而只是让人看看,并不让编辑。但总之,至此已写完了一个简单的UI
接下来,要实现计时器的核心功能——计时,从而需要写c++ 代码。首先在.h 文件中,写入需要的成员变量。考虑到要实现计时器的功能,所以至少需要一个用于计时的时钟和一个可以记录秒数的整数。故而进入mainWindow.h ,在private: 下输入成员,当然也不要忘了导入头文件,最终结果为
private:
Ui::MainWindow *ui;
QTimer * timer;
QTime * TimeRecord;
除了成员变量,还要有成员函数。其中计时需要绑定一个函数,start 按钮需要绑定一个,外加时间归零需要一个,故需三个成员函数,最终mainWindow.h 内容为
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTimer>
#include <QTime>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void initTime();
void updateTime();
void pbStart_clicked();
private:
Ui::MainWindow *ui;
QTimer * timer;
QTime * TimeRecord;
};
#endif
定义好头文件,接下来就要在.cpp 中具体实现了,代码总共不到50行,如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent) , ui(new Ui::MainWindow)
{
ui->setupUi(this);
timer = new QTimer;
TimeRecord = new QTime;
ui->Timer->setDigitCount(8);
initTime();
connect(timer, SIGNAL(timeout()), this, SLOT(updateTime()));
connect(ui->pbStart, SIGNAL(clicked()), this, SLOT(pbStart_clicked()));
}
MainWindow::~MainWindow(){
delete ui;
}
void MainWindow::initTime(){
TimeRecord->setHMS(0, 0, 0);
ui->Timer->display(TimeRecord->toString("hh:mm:ss"));
}
void MainWindow::updateTime(){
*TimeRecord = TimeRecord->addSecs(1);
ui->Timer->display(TimeRecord->toString("hh:mm:ss"));
}
void MainWindow::pbStart_clicked(){
if (QString::compare(ui->pbStart->text(),"stop")){
timer->start(1000);
ui->pbStart->setText("stop");
}else{
timer->stop();
ui->pbStart->setText("start");
initTime();
}
}
|