基于Qt的动态时钟

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>



QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void paintEvent(QPaintEvent *);//绘制时钟函数
private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QPainter>
#include<QPen>
#include<QTime>
#include<QTimer>
#include <QLabel>
#include<QPushButton>
#include<QLCDNumber>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //禁止用户点击窗口最大化按钮
    setWindowFlags(windowFlags()& ~Qt::WindowMaximizeButtonHint);
    //设置窗口大小
    resize(600,600);

    //定时器
    QTimer *timer=new QTimer(this);//产生一个定时器
    connect(timer,SIGNAL(timeout()),this,SLOT(update()));
    timer->start(1000);//启动定时器,每一秒钟更新一次
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::paintEvent(QPaintEvent *)
{
    static const QPoint hour[3]=
    {
        QPoint(14,15),
        QPoint(-14,15),
        QPoint(0,-110),
    };
    static const QPoint minute[3]=
    {
        QPoint(11,13),
        QPoint(-11,13),
        QPoint(0,-170),
    };
    static const QPoint second[3]=
    {
        QPoint(7,8),
        QPoint(-7,8),
        QPoint(0,-210),
    };

    int size=qMin(width(),height());//获取宽度和高度
    QTime time=QTime::currentTime();//获取系统当前时间
    QPainter p(this);//创建画家对象
    p.setRenderHint(QPainter::Antialiasing);//防止图形形变
    p.translate(width()/2,height()/2);//平移坐标系到中心
    p.scale(size/600.0,size/600.0);//绽放

    QBrush brush;//定义一个画刷
    brush.setColor(QColor(245,182,95));//设置画刷颜色
    brush.setStyle(Qt::SolidPattern);//设置样式

    QPen pen;//定义画笔
    pen.setWidth(18);//设置画笔宽度
    pen.setColor(QColor(205,214,216));//rgb设置颜色
    pen.setStyle(Qt::SolidLine);//设置风格
    p.setPen(pen);//将画笔交给画家
    p.drawEllipse(QPoint(0,0),280,280);//画圆

    pen.setWidth(160);
    pen.setColor(Qt::white);
    p.setPen(pen);//将画笔交给画家
    p.drawEllipse(QPoint(0,0),160,160);//画圆

    //绘制时针
    p.setBrush(brush);//将画刷交给画家
    p.setPen(Qt::NoPen);
    p.save();//保存当前 状态
    //图形旋转,以原点为旋转中心,顺时针水平旋转对应时针角度
    p.rotate(30.0*(time.hour()+time.minute()/60.0));
    p.drawConvexPolygon(hour,3);
    p.restore();//恢复上一次保存的结果,和save()成对出现

    //绘制小时线
    pen.setStyle(Qt::SolidLine);
    pen.setWidth(5);
    pen.setColor(Qt::black);
    p.setPen(pen);


    //绘制分针
    p.setPen(Qt::NoPen);
    p.setBrush(QColor(144,199,247));
    p.save();
    p.rotate(6.0*(time.minute()+time.second()/60.0));
    p.drawConvexPolygon(minute,3);
    p.restore();

    //绘制分钟线
    pen.setStyle(Qt::SolidLine);
    pen.setColor(QColor(0,0,0));
    pen.setWidth(1);
    p.setPen(pen);
    for(int i=0;i<60;i++)
    {
        if(i%5!=0)
        {
            p.drawLine(0,265,0,270);//5的位数时不能画,因为有小时线
        }
        p.rotate(6);//每画一次就旋转6度
    }

    pen.setStyle(Qt::SolidLine);
    pen.setWidth(5);
    pen.setColor(Qt::black);
    p.setPen(pen);

    for(int i=0;i<12;i++)
    {
        p.drawLine(0,268,0,276);//画小时线
        p.drawText(-5,-235,QString::number(i));//表明小时数量
        p.rotate(30);//每画一次旋转30度
    }


    //绘制秒针
    p.setPen(Qt::NoPen);
    p.setBrush(QColor(119,217,176));
    p.save();
    p.rotate(6*time.second());//顺时针旋转到秒针的位置
    p.drawConvexPolygon(second,3);
    p.restore();

    //绘制动态时钟,上午 下午
    p.setPen(Qt::black);
    if(time.hour()>=12)
        p.drawText(-6,-50,"PM");//绘制文本区
    else
        p.drawText(-6,-50,"AM");//绘制文本区

    p.drawText(-50,-100,"Made in China");
}

main.cpp:

#include "mainwindow.h"

#include <QApplication>

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

运行效果:

 

好的,基于Qt时钟万年历可以分为两个部分:时钟和万年历。 首先是时钟部分。我们可以使用Qt自带的QTimer类来实现时钟的计时功能,然后通过QLabel控件来展示当前时间。具体实现步骤如下: 1. 在Qt Designer中创建一个界面,添加一个QLabel控件用于显示当前时间。 2. 在mainwindow.h文件中定义一个QTimer成员变量,用于实现定时器功能。 3. 在mainwindow.cpp文件的构造函数中初始化QTimer,并连接到一个槽函数中,用于更新QLabel控件上的时间显示。 4. 在槽函数中使用QDateTime类获取当前时间,并将其转换为字符串,最后更新QLabel控件上的显示内容。 下面是示例代码: mainwindow.h: ```c++ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QTimer> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void updateTime(); private: Ui::MainWindow *ui; QTimer *timer; }; #endif // MAINWINDOW_H ``` mainwindow.cpp: ```c++ #include "mainwindow.h" #include "ui_mainwindow.h" #include <QDateTime> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); // 初始化定时器 timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(updateTime())); timer->start(1000); // 每隔1秒更新一次时间 } MainWindow::~MainWindow() { delete ui; } void MainWindow::updateTime() { QDateTime currentDateTime = QDateTime::currentDateTime(); QString currentTimeStr = currentDateTime.toString("hh:mm:ss"); ui->label_time->setText(currentTimeStr); } ``` 接下来是万年历部分。我们可以使用QCalendarWidget控件来实现万年历的功能,具体实现步骤如下: 1. 在Qt Designer中添加一个QCalendarWidget控件用于显示万年历。 2. 通过QTabWidget控件来实现时钟和万年历的切换,并在槽函数中根据当前选中的标签来显示对应的内容。 下面是示例代码: mainwindow.h: ```c++ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QTimer> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void updateTime(); void on_tabWidget_currentChanged(int index); private: Ui::MainWindow *ui; QTimer *timer; }; #endif // MAINWINDOW_H ``` mainwindow.cpp: ```c++ #include "mainwindow.h" #include "ui_mainwindow.h" #include <QDateTime> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); // 初始化定时器 timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(updateTime())); timer->start(1000); // 每隔1秒更新一次时间 // 绑定tab切换事件 connect(ui->tabWidget, SIGNAL(currentChanged(int)), this, SLOT(on_tabWidget_currentChanged(int))); } MainWindow::~MainWindow() { delete ui; } void MainWindow::updateTime() { QDateTime currentDateTime = QDateTime::currentDateTime(); QString currentTimeStr = currentDateTime.toString("hh:mm:ss"); ui->label_time->setText(currentTimeStr); } void MainWindow::on_tabWidget_currentChanged(int index) { if (index == 1) { // 切换到万年历页 ui->calendarWidget->setMaximumDate(QDate(9999, 12, 31)); ui->calendarWidget->setMinimumDate(QDate(1, 1, 1)); } } ``` 这样,我们就实现了一个基于Qt时钟万年历应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值