应小伙伴的要求,做一个小计时器。功能是点击开始就从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都是使用拷贝的那一份了,就可以在其他电脑上运行了。