應小伙伴的要求,做一個小計時器。功能是點擊開始就從00:00:00開始計時,點擊暫停就暫停計時,點擊停止就停止計時。
界面如上圖,使用ui設計師直接拖的。按鈕和圖標的圖片都是網上下載的。用美圖秀秀摳成了透明的,看起來會好看一點。
整體代碼挺容易的,就是設一個定時器。代碼如下:
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QDateTime> #include <QTimer> #include <QTime> #include <QPixmap> #include <QIcon> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private slots: void updateTime(); void on_Start_clicked(); void on_Stop_clicked(); private: Ui::MainWindow *ui; QTimer * timer; //定時器 每秒更新時間 QTime * TimeRecord; //記錄時間 bool isStart; //記錄是否已經開始計時 QIcon * startIcon; QIcon * pauseIcon; QIcon * stopIcon; }; #endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); setWindowIcon(QIcon(":/icon.png")); setWindowTitle("TimerZ"); //setWindowFlags(Qt::FramelessWindowHint); isStart = false; //初始為還未計時 timer = new QTimer; //初始化定時器 TimeRecord = new QTime(0, 0, 0); //初始化時間 ui->Timer->setDigitCount(8); ui->Timer->setSegmentStyle(QLCDNumber::Flat); ui->Timer->display(TimeRecord->toString("hh:mm:ss")); QPixmap pixStart(":/start.png"); startIcon = new QIcon(pixStart); QPixmap pixPause(":/pause.png"); pauseIcon = new QIcon(pixPause); QPixmap pixStop(":/stop.png"); stopIcon = new QIcon(pixStop); ui->Start->setIcon(*startIcon); ui->Start->show(); ui->Stop->setIcon(*stopIcon); ui->Stop->show(); connect(timer,SIGNAL(timeout()),this,SLOT(updateTime())); } MainWindow::~MainWindow() { delete ui; } void MainWindow::updateTime() { *TimeRecord = TimeRecord->addSecs(1); ui->Timer->display(TimeRecord->toString("hh:mm:ss")); } void MainWindow::on_Start_clicked() { if(!isStart) //尚未開始 開始計時 { ui->Start->setIconSize(QSize(70,70)); ui->Start->setIcon(*pauseIcon); ui->Start->show(); timer->start(1000); } else //已經開始,暫停 { ui->Start->setIcon(*startIcon); ui->Start->show(); timer->stop(); } isStart = !isStart; } void MainWindow::on_Stop_clicked() { timer->stop(); //計時器停止 TimeRecord->setHMS(0,0,0); //時間設為0 ui->Timer->display(TimeRecord->toString("hh:mm:ss")); //顯示00:00:00 isStart = false; }
main.cpp 沒改過
#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
具體的難點是在發布的時候,點擊生成的EXE總是運行不了。結果發現需要把所有用到的動態鏈接庫都拷到exe的文件夾里。
下一個DLLShow可以顯示程序運行所用到的所有的鏈接庫,把用到的庫拷到一起就好了。還下了一個ProcessExplorer也是同樣的用途,看起來會更數目一點。
使用DLLShow的時候會像下圖這樣:
用ProcessExplorer像下圖這樣:
加注:
在我把所有用到的DLL拷到一個文件夾后,再次用DLLShow檢測,發現所有plugin文件夾下的DLL還是使用的原位置的,而不是我拷貝的那一個。這樣,應用在其他電腦上無法使用。
后來發現,要把plugin文件夾拷貝到當前文件夾下,保留里面的目錄結構,當然,不用的DLL可以刪掉。然后,在代碼主函數中加入:
QApplication::addLibraryPath("./plugins");
這樣,再次運行時,所有的DLL都是使用拷貝的那一份了,就可以在其他電腦上運行了。