QTday4(用绘制事件实现钟表)

Widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPaintEvent>
#include <QtDebug>
#include <QPainter>
#include <QColor>
#include <QTimer>
#include <QTime>
#include <QTimerEvent>
#include <QDateTime>
#include <QPalette>
#include <QMouseEvent>

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;

    void timerEvent(QTimerEvent *event) override;

    void mousePressEvent(QMouseEvent *event) override;

    void mouseMoveEvent(QMouseEvent *event) override;

private:
    Ui::Widget *ui;

    int t_id;

    int hh=0,mm=0,ss=0;

    //定义Qpoint类记录鼠标起始点
    QPoint startPoint;
};
#endif // WIDGET_H


Widget.cpp:

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    t_id = this->startTimer(1000);
    setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);//去掉标题栏
    setAttribute(Qt::WA_TranslucentBackground, true);//设置窗口背景透明
}

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

//定义绘制事件处理函数
void Widget::paintEvent(QPaintEvent *event)
{
    //实例化一个画家类
    QPainter p1(this);

    //给画家类设置画笔
    p1.setPen(QColor("skyblue"));

    //给画家设置字体
    p1.setFont(QFont("华文隶书"));

    //设置画家坐标起点
    p1.translate(this->width()/2, this->height()/2);

    //绘制矢量文字
    //p1.drawText(this->width()/2, this->height()/2, "hello world");

    p1.setBrush(QBrush(QColor(213,248,253)));

    //画圆形
    p1.drawEllipse(QPointF(0,0),200,200);

    //画时刻表
    p1.setPen(QColor(255,0,0));
    for(int i = 0; i < 60; i ++){
        p1.drawLine(200,0, 190,0);
        p1.rotate(6);
    }

    //画小时格子
    QPen pen;
    pen.setWidth(3);
    p1.setPen(pen);
    for(int i = 1; i<= 12; i ++){
        p1.rotate(30);
        p1.drawLine(0,-200, 0,-185);
        p1.drawText(0,-170, QString("%1").arg((i)));
    }

    QPainter p2(this);

    p2.setPen(QColor(38,251,235));
    p2.translate(this->width()/2, this->height()/2);
    p2.rotate(-90);
    QPen pen2;
    pen2.setWidth(3);
    p2.setPen(pen2);
    //绘制秒针:
    p2.rotate(ss*6);
    p2.drawLine(0,0, 160,0);

    //绘制分针:
    p2.rotate(-ss*6);
    p2.rotate(mm*6+ss*6/60);
    p2.drawLine(0,0, 120,0);

    //绘制时针:
    p2.rotate(-mm*6-ss*6/60);
    p2.rotate(hh*30+mm*6/12+ss*6/60/12);
    p2.drawLine(0,0, 100,0);
}

void Widget::timerEvent(QTimerEvent *event)
{
    if(event->timerId() == t_id){
        QDateTime NowTime = QDateTime::currentDateTime();

        QString NowTimeString = NowTime.toString("hh:mm:ss");


        QStringList list = NowTimeString.split(":");
        hh = list[0].toUInt();
        mm = list[1].toUInt();
        ss = list[2].toUInt();
        update();
    }
}


void Widget::mousePressEvent(QMouseEvent *event)
{
    startPoint = event->globalPos() - this->frameGeometry().topLeft();
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    this->move(event->globalPos() - startPoint);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值