【QT】计时器制作

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

 

 

应用下载:http://pan.baidu.com/s/1o6j2rxw

posted @ 2015-05-05 18:55  匡子语  阅读(8846)  评论(0编辑  收藏  举报