基于QT5实现一个时钟桌面

 更新时间:2022年01月21日 14:53:18   作者:樊城  
这篇文章主要介绍了利用QT5实现的一个时钟桌面,文中的示例代码讲解详细,对我们学习或工作有一定的帮助,感兴趣的小伙伴可以了解一下

介绍

这是一个简单的时钟运行界面,项目的结构如图所示,主要包含一个头文件:** analogclock.h **,两个源文件: ** analogclock.cpp main.cpp **.

看完本教程,你就可以知悉在Windows系统上如何实现一个界面程序并部署在Windows系统上。

实现代码

clock.pro 

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    analogclock.cpp

HEADERS += \
    analogclock.h

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

analogclock.h 

#ifndef ANALOGCLOCK_H
#define ANALOGCLOCK_H

#include <QWidget>

class AnalogClock : public QWidget
{
    Q_OBJECT

public:
    AnalogClock(QWidget *parent=0);
protected:
    void paintEvent(QPaintEvent *event) override;
};
#endif // WIDGET_H

analogclock.cpp

#include <QtWidgets>
#include "analogclock.h"
AnalogClock::AnalogClock(QWidget *parent)
    : QWidget(parent)
{
    QTimer *timer = new QTimer(this);
    //实例一个QTimer的类
    connect(timer, SIGNAL(timeout()), this, SLOT(update()));
    //监控timeout()信号是否发出
    //timeout()表示:This signal is emitted when the timer times out.
    //指计时器发出信号,即下面的延时器发出信号
    timer->start(1000);//设置1s的延时
   /*
    *for a function
    * void QTimer::start(int msec)
    * Starts or restarts the timer with a timeout interval of msec milliseconds.
    * If the timer is already running, it will be stopped and restarted.
    * If singleShot is true, the timer will be activated only once.
    * 单位是毫秒,表示每一秒设置一个信号发出
    */
    setWindowTitle(tr("Analog Clock"));
    //void setWindowTitle(const QString &)
    resize(200, 200);
    //初始值大小
}
void AnalogClock::paintEvent(QPaintEvent *)
 {
    /*
     *
     *   repaint() or update() was invoked,
     *   the widget was obscured and has now been uncovered, or
     *   many other reasons.
     *
     *
     */
    static const QPoint hourHand[3] = {
        QPoint(7, 8),
        QPoint(-7, 8),
        QPoint(0, -40)
    };//用于绘制时针的三角形
    static const QPoint minuteHand[3] = {
        QPoint(7, 8),
        QPoint(-7, 8),
        QPoint(0, -60)
    };//用于绘制分针的三角形
    static const QPoint secondHand[3]={
        QPoint(7,8),
        QPoint(-7,8),
        QPoint(0,-90)
    };//用于绘制秒针的三角形

    QColor hourColor(127, 0, 127);
    QColor minuteColor(0, 127, 127, 191);
    //QColor::QColor(int r, int g, int b, int a = 255)a表示透明度
    QColor secondColor(220,20,60,100);
    //为每一个图形绘制颜色及透明度

    int side = qMin(width(), height());
    //我认为这一句的作用在于找到最小标出,用于坐标系的绘制

    QTime time = QTime::currentTime();
    qDebug()<<time<<'\n';//用于检验现在的时间

    QPainter painter(this);//Qt强大的画图工具
    painter.setRenderHint(QPainter::Antialiasing);// 用于反锯齿
    //针对所有的组件,都反锯齿//表示设置渲染提示

    painter.translate(width() / 2, height() / 2);//将原点放在中心
    painter.scale(side / 200.0, side / 200.0);//Scales the coordinate system by (sx, sy).标尺坐标系
    //Qt画板的x和y表示什么,x表示横线吗,y表示纵线吗?对的
    //说明横坐标的范围是-100到100
    //   纵坐标的范围是-100到100

//时针:
    painter.setPen(Qt::NoPen);//一般用于描边,Qt::NoPen表示画笔没有边界
    painter.setBrush(hourColor);//一般用于填充

    //先将原先的painter存储起来,对目前的painter操作,目前的操作不对原本的产生影响,即原本不旋转
    painter.save();//首先将原先画笔类似于入栈,对另一个画笔操作
    painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));//表示旋转,若缺少painter.save(),会对整个painter类旋转
    painter.drawConvexPolygon(hourHand, 3);//绘制多边形
    painter.restore();//与painter.save()配套使用


    painter.setPen(hourColor);

    for (int i = 0; i < 12; ++i) {
        painter.drawLine(88, 0, 96, 0);
        painter.rotate(30.0);//画横线,表示时间示数的标尺
    }//分针和秒针同时针

//分针:
    painter.setPen(Qt::NoPen);
    painter.setBrush(minuteColor);

    painter.save();
    painter.rotate(6.0 * (time.minute() + time.second() / 60.0));
    painter.drawConvexPolygon(minuteHand, 3);
    painter.restore();

    painter.setPen(minuteColor);
    for (int j = 0; j < 60; ++j) {
        if ((j % 5) != 0)
            painter.drawLine(92, 0, 96, 0);
        painter.rotate(6.0);
    }

//时针:
    painter.setPen(Qt::NoPen);
    painter.setBrush(secondColor);

    painter.save();
    painter.rotate(6*time.second());
    painter.drawConvexPolygon(secondHand,3);
    painter.restore();


}

main.cpp

#include "analogclock.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    AnalogClock w;
    w.show();
    return a.exec();
}

编译打包

编译

一般编译过程采用的是debug版本,但是给其他用户使用最好是release版本,因此打包前需要切换到release版本重新编译一遍。

这样在项目文件夹中会有两种版本的exe执行程序。

打包

生成release版本的exe后,进入文件夹中,将release文件夹中的clock.exe复制到单独的文件夹中 ,我复制到myClock文件夹中。

在开始菜单中,选择下图红色的cmd。

进入到myClock文件夹中,输入 windeployqt clock.exe 

打包完成后,在myClock文件夹中就可以看到各种.dll链接库文件,这是exe文件依赖的库文件,此时双击clock.exe就可以动态显示时钟了。

将该文件夹打包,就可以部署到其他的Windows系统上。

到此这篇关于基于QT5实现一个时钟桌面的文章就介绍到这了,更多相关QT5时钟桌面内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言实现五子棋对战系统

    C语言实现五子棋对战系统

    这篇文章主要为大家详细介绍了C语言实现五子棋对战系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C语言实现扫雷游戏简易版

    C语言实现扫雷游戏简易版

    这篇文章主要为大家详细介绍了C语言实现扫雷游戏简易版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • C语言 字符串指针详解及示例代码

    C语言 字符串指针详解及示例代码

    本文主要介绍C语言 字符串指针,这里整理了详细资料,并附示例代码及实现结果,有兴趣的小伙伴可以参考下
    2016-08-08
  • 深入浅析OpenCV copyTo()函数

    深入浅析OpenCV copyTo()函数

    在Mat矩阵类的成员函数中copyTo(roi , mask)函数是非常有用的一个函数,尤其是后面的mask可以实现蒙版的功能,下面通过本文给大家介绍下OpenCV copyTo()函数的相关知识,感兴趣的朋友一起看看吧
    2022-01-01
  • 深入剖析Android中init进程实现的C语言源码

    深入剖析Android中init进程实现的C语言源码

    这篇文章主要介绍了Android中init进程实现的C语言源码,init属性服务在安卓中属于系统的底层Linux服务,需要的朋友可以参考下
    2015-07-07
  • 关于AVLTree(C++实现)没有统一旋转操作的问题

    关于AVLTree(C++实现)没有统一旋转操作的问题

    这篇文章主要介绍了关于AVLTree(C++实现)没有统一旋转操作的问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • C++代码实现扫雷游戏

    C++代码实现扫雷游戏

    这篇文章主要为大家详细介绍了C++代码实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • QT使用QComBox和QLineEdit实现模糊查询功能

    QT使用QComBox和QLineEdit实现模糊查询功能

    模糊查询是指根据用户输入的文本,在下拉框的选项中进行模糊匹配,并动态地显示匹配的选项,本文将使用QComBox和QLineEdit实现模糊查询功能,需要的可以参考下
    2023-11-11
  • C++ OpenCV实战之文档照片转换成扫描文件

    C++ OpenCV实战之文档照片转换成扫描文件

    这篇文章主要为大家介绍一个C++ OpenCV的实战——文档照片转换成扫描文件,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-09-09
  • c++ 判断是64位还是32位系统的实例

    c++ 判断是64位还是32位系统的实例

    这篇文章主要介绍了c++ 判断是64位还是32位系统的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12

最新评论