2023/09/20 day4 qt

做一个动态指针钟表

头文件

复制代码
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPainter>       //绘制事件类
#include <QPaintEvent>    //画家类
#include <QTime>
#include <QTimer>
#include <QTimerEvent>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    //重写绘制事件处理函数
    void paintEvent(QPaintEvent *event)override;


private slots:
    void on_startbtn_clicked();

    void timeout_slot();
private:
    Ui::Widget *ui;

    //定义一个定时器的对象指针
    QTimer *timer;
};
#endif // WIDGET_H

源文件

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //给定时器指针实例化对象
    timer = new  QTimer(this);
    connect(timer,&QTimer::timeout,this,&Widget::timeout_slot);
}

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

void Widget::paintEvent(QPaintEvent *event)
{
    //定义一个画家类
    QPainter p1(this);

    //实例化一个画笔
    QPen pen1;   //无参构造
    pen1.setColor(QColor("red"));
    pen1.setStyle(Qt::SolidLine); //设置线形,默认实线
    pen1.setWidth(5); //设置粗细
    p1.setPen(pen1);
    //直径
    int side = qMin(this->width(),this->height());
    //设置起始坐标
    p1.translate(this->width()/2,this->height()/2); //ui界面中心
    //画个圆圈当作表盘
    p1.drawEllipse(QPoint(0,0),side/2,side/2);

    //绘制刻度线
    pen1.setColor(QColor("black"));
    pen1.setWidth(3);
    p1.setPen(pen1);
    for(int i=0;i<12;i++)
    {
        p1.drawLine(0,-side/2+10,0,-side/2+20);
        p1.rotate(30);
    }

    //绘制时针、分针、秒针
    QTime curretTime = QTime::currentTime();
    //时针
    p1.setPen(Qt::NoPen);
    p1.setBrush(Qt::blue);
    p1.save();
    p1.rotate(30*(curretTime.hour()+curretTime.minute()/60));
    p1.drawConvexPolygon(QPolygon(QVector<QPoint>()<<QPoint(-2,-40)<<QPoint(2,-40)<<QPoint(4,0)<<QPoint(-4,0)));
    p1.restore();
    //分针
    p1.setBrush(Qt::black);
    p1.save();
    p1.rotate(6*(curretTime.minute() + curretTime.second() / 60));
    p1.drawConvexPolygon(QPolygon(QVector<QPoint>() << QPoint(-1, -50) << QPoint(1, -50) << QPoint(1, 100) << QPoint(-1, 100)));
    p1.restore();

    //秒针
    p1.setPen(Qt::red);
    p1.setBrush(Qt::red);
    p1.save();
    p1.rotate(6* curretTime.second());
    p1.drawConvexPolygon(QPolygon(QVector<QPoint>() << QPoint(-1, -70) << QPoint(1, -70) << QPoint(0, 160) << QPoint(-0, 160)));
    p1.restore();
}



//启动定时器按钮对应的槽函数
void Widget::on_startbtn_clicked()
{
    timer->start(1000);
}

void Widget::timeout_slot()
{
    update();
}

效果图

相关推荐
我是唐青枫14 分钟前
C#.NET PInvoke 深入解析:封送、内存布局与原生互操作实战
开发语言·c#·.net
程序猿编码23 分钟前
纯C++轻量计算机视觉推理引擎:基于GGML的端侧CV模型部署技术全解析
开发语言·c++·计算机视觉·大模型·transformer
SEO_juper41 分钟前
外贸多语言站最隐蔽的流量杀手:hreflang 错了,谷歌把德语页推给美国人(附审计脚本)
开发语言·前端·python·seo·独立站·谷歌优化
geovindu1 小时前
CSharp: Strategy Pattern
开发语言·后端·c#·.net·.netcore·策略模式·行为模式
Tairitsu_H1 小时前
[C++] C++11新增构造:列表初始化和std::initializer_list
开发语言·c++·c++11·构造
宣宣猪的小花园.1 小时前
【嵌入式】故障与降级:看门狗、保护机制和工程可靠性的底线
开发语言·人工智能·嵌入式硬件·机器学习
shmily麻瓜小菜鸡2 小时前
JS/TS 易踩坑知识点 — 自动分号插入(ASI)
开发语言·javascript·ecmascript
CoderYanger2 小时前
前端基础——JavaScript(WebAPI)代码案例
java·开发语言·前端·javascript·css·前端框架·html5
geovindu2 小时前
CSharp: Task Scheduler
开发语言·后端·c#·.net·.netcore
qq_401700412 小时前
Qt窗体大小控制从resize到自适应
开发语言·qt