zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    用Darwin和live555实现的直播框架
    用Darwin和live555实现的直播框架
    VS2010 C++编译报错LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
    VS2010编译和运行项目错误
    C#如何使用VS2010与SQL2008建立链接及初步调用(转)
    linQ to sql 查询生成的sql语句
    查看Linq to Sql生成的sql语句(转)
    linq to sql 项目移植后,数据库实体类需要重新创建?
    什么是Asp.net Core?和 .net core有什么区别?(转)
    ASP.NET Core 2.0 使用支付宝PC网站支付实现代码(转)
  • 原文地址:https://www.cnblogs.com/dplearning/p/4480017.html
Copyright © 2011-2022 走看看