【QT】day4

2023-09-20 21:24:09

闹钟
头文件:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QDebug>
#include <QMouseEvent>  //鼠标时间
#include <QPaintEvent>  //绘制时间
#include <QPainter> //画家时间
#include <QPixmap>  //图形引擎类
#include <QTimerEvent> //定时器事件处理类
#include <QTime>        //时间类
#include <QTimer>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public slots:
    void updateTime();


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


private:
    Ui::Widget *ui;
//    int timer_id;
};
#endif // WIDGET_H

源文件:

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
//    timer_id=this->startTimer(1000);
    QTimer *timer = new QTimer(this);
    connect(timer,&QTimer::timeout,this,&Widget::updateTime);
    timer->start(1000);

}

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

//绘制事件处理函数的定义
void Widget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    //实例化一个画家
    QPainter painter(this);

    //实例化一个画笔
    QPen pen;       //使用无参构造
    pen.setColor(QColor("green"));
    pen.setStyle(Qt::SolidLine);   //设置线性
    pen.setWidth(5);
    //    pen.setBrush(QBrush(Qt::RadialGradientPattern));

    //将画笔给画家安排上
    painter.setPen(pen);

    //给画家偏移起始坐标点
    painter.translate(this->width()/2,this->height()/2);

    //给画家偏移坐标系
    painter.rotate(0);        //选择坐标系
    painter.setBrush(QBrush(QColor("yellow")));    //给画家设置画刷
    //画个圆
    painter.drawEllipse(QPoint(0,0),300,300);

    //    painter.drawLine(0,-300,0,-265);
    //    for(int i=0;i<12;i++)       //旋转坐标系一周,每次30度,回到原来的点
    //    {
    //        painter.drawLine(0,-300,0,-265);    //画小时的直线
    //        painter.rotate(30);        //旋转坐标系
    //    }

    for(int i=0;i<60;i++)       //旋转坐标系一周,每次6度,回到原来的坐标系
    {
        if((i*6)%30==0)
        {
            painter.drawLine(0,-300,0,-265);    //画小时的直线
            painter.rotate(6);        //旋转坐标系
        }else
        {
            painter.drawLine(0,-300,0,-285);    //画分钟的直线
            painter.rotate(6);        //旋转坐标系
        }
    }
    /***************绘制适量文字****************/
    painter.translate(-this->width()/2,-this->height()/2);
    pen.setColor(QColor("violet"));
    painter.setPen(pen);
    //给画家设置字体
    painter.setFont(QFont("隶书",40,2));

    //绘制矢量文字
    painter.drawText(this->rect(),Qt::AlignCenter,"一个小闹钟");

    //绘制时针
    int X=this->width()/2;
    int Y=this->height()/2;
    painter.save();    // 保存当前的绘制状态
    //获取当前时间
    QTime currentTime = QTime::currentTime();
    painter.translate(X,Y);    // 将绘制的坐标原点移动到表盘的中心
    int hour = currentTime.hour();    // 获取当前的小时
    int minute = currentTime.minute();     // 获取当前的分钟
    double hourAngle = (hour%12 + minute/60.0)*30.0;  // 计算时针的角度,考虑分钟对时针的影响
    painter.rotate(hourAngle);    // 旋转坐标系,使时针指向正确的位置
    painter.setPen(QPen(Qt::black,5));    //设置笔
    painter.drawLine(0,0,0,-300*0.5);  // 绘制时针,起点是坐标原点 (0, 0),终点是时针的末端位置
    painter.restore();       // 恢复之前保存的绘制状态,以便后续绘制

    /***********************************下面同理******************************/
    //绘制分针
    painter.save();
    painter.translate(X,Y);
    double minuteAngle = minute*6.0;
    painter.rotate(minuteAngle);
    painter.setPen(QPen(Qt::red,3));        //设置笔
    painter.drawLine(0,0,0,-300*0.7);
    painter.restore();

    //绘制秒针
    painter.save();
    painter.translate(X,Y);
    int second = currentTime.second();
    double secondAngle = second * 6.0;
    painter.rotate(secondAngle);
    painter.setPen(QPen(Qt::blue,2));      //设置笔
    painter.drawLine(0,0,0,-300*0.9);
    painter.restore();


}

//定时器处理时间函数的定义
void Widget::updateTime()
{
    update();
}

闹钟效果图

更多推荐

趣解设计模式之《珍爱生命,远离只狼》

〇、小故事小王最近打算入手一款叫《只狼》的游戏,这款游戏特别的硬核,也就是说,普通的小怪战斗力都特别的强,而作为主角的我们,也很容易被小兵打败。除了游戏中的小兵和Boss很难打败之外,如果在游戏中被杀了,也需要从这章的开头开始打,没办法直接从死亡点附近复活,这个就又为游戏增加了难度。不过,对这款游戏痴迷的玩家依然很多很

MC-4/11/01/400 ELAU 软件允许用户完全访问相机设置

MC-4/11/01/400ELAU软件允许用户完全访问相机设置一个完整的Sentinel模具保护解决方案包括一到四台冲击式摄像机、专用红外LED照明和镜头、Sentinel软件以及所有与模压机连接的必要互连组件。摄像机支架基于磁性,可快速、安全、灵活地部署。此外,一个可选的工业电脑和显示器可在一个移动推车,快速新闻到

移动端H5封装一个 ScrollList 横向滚动列表组件,实现向左滑动

效果:1.封装组件:<template><divclass="scroll-list"><divclass="scroll-list-content":style="{background,color,fontSize:size}"ref="scrollListContent"><divclass="scroll-li

第七章(2):深度学习在自然语言处理NLP中的应用

第七章(2):深度学习在自然语言处理NLP中的应用作者:安静到无声个人主页作者简介:人工智能和硬件设计博士生、CSDN与阿里云开发者博客专家,多项比赛获奖者,发表SCI论文多篇。Thanks♪(・ω・)ノ如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!o( ̄▽ ̄)d欢迎大家来到安静到无声的《基于

Python--函数

目录1、定义函数1.1向函数传递信息1.2实参和形参2、传递实参2.1位置实参2.2关键字实参2.3默认值2.4等效的函数调用2.5避免实参错误3、返回值3.1返回简单的值3.2让实参变成可选的3.3返回字典3.4结合使用函数和While循环4、传递列表4.1在函数中修改列表4.2禁止函数修改列表5、传递任意数量的实参

C++学习笔记——类与对象(六个默认成员函数)

1、构造函数在一个类中,编译器会自动生成默认的成员函数,当对象进行初始化时,会默认调用这个函数来初始化。构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有一个合适的初始值,并且在对象整个生命周期内只调用一次。它的特点是:没有返回值系统自动调用构造函数可以重载名字和类名

简单工厂模式 和 工厂方法 和 抽象工厂的区别

简单工厂模式、工厂方法模式和抽象工厂模式是三种不同的创建型设计模式,它们在对象的创建和封装方面有不同的用途和实现方式。以下是它们之间的主要区别:1.**简单工厂模式(SimpleFactoryPattern)**:-**目的**:简单工厂模式的主要目的是封装对象的创建逻辑,以便客户端代码无需知道具体对象的创建细节。它将

展会预告 | 图扑邀您共聚 IOTE 国际物联网展·深圳站

参展时间:9月20日-22日图扑展位:9号馆9B35-1参展地址:深圳国际会展中心(宝安新馆)IOTE2023第二十届国际物联网展·深圳站,将于9月20日-22日在深圳国际会展中心(宝安)9、10、11号馆震撼来袭。本届展会以“IoT构建数字经济底座”为主题,将IoT技术引入实体经济领域,促进数字化转型和智能化升级,推

基于Java+SpringBoot+Vue前后端分离旅游网站设计和实现

博主介绍:✌全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌🍅文末获取源码联系🍅👇🏻精彩专栏推荐订阅👇🏻不然下次找不到哟2022-2024年最全的计算机软件毕业设计选题

基于Java旅游管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌🍅文末获取源码联系🍅👇🏻精彩专栏推荐订阅👇🏻不然下次找不到哟2022-2024年最全的计算机软件毕业设计选题

python经典百题之最大公约数与最小公倍数

题目:输入两个正整数m和n,求其最大公约数和最小公倍数。方法1:辗转相除法(欧几里德算法)求最大公约数defgcd_euclidean(m,n):whilen:m,n=n,m%nreturnmm=36n=48gcd_result=gcd_euclidean(m,n)print("GCD:",gcd_result)#计算

热文推荐