当前位置: 首页 > article >正文

坐牢第三十八天(Qt)

1、使用Qt绘画事件处理画一个闹钟

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QDebug>
#include <QPaintEvent>//画画处理事件
#include <QPainter>//画画
#include <QTime>   //时间类
#include <QTimer> //计时器类
#include <QIcon> //图标类
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);//绘制事件
public slots:
    //timeout信号的槽函数
    void timeout_slot();

private:
    Ui::Widget *ui;
    QPoint startpoin;//绘制起始点

    QTimer* timer1;  //定义一个定时器类的指针
    quint8 hour;
    quint8 minute;
    quint8 second;

    int cnt;

};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QtMath>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->setFixedSize(800,800);//设置固定大小
    this->setWindowTitle("牛逼的闹钟");
    this->setWindowIcon(QIcon(":/icon/naozhong.png"));//设置窗体图标

    timer1 = new QTimer(this);//给定时器类指针实例化对象
    timer1->start(1000);

    //将定时器类对象的timeout信号与自定义的槽函数进行连接
    connect(timer1,&QTimer::timeout,this,&Widget::timeout_slot);

}

Widget::~Widget()
{
    delete ui;
}
//绘制事件处理函数
void Widget::paintEvent(QPaintEvent *event)
{
    QTime timer =QTime::currentTime();//获取当前时间
    QString t=timer.toString("hh:mm:ss");//转换为字符串
    QStringList tlist =t.split(":"); //以 :分割t

    hour =tlist[0].toUInt(); //将小时传化为无符号整数
    minute =tlist[1].toUInt(); //将分钟传化为无符号整数
    second =tlist[2].toUInt(); //将秒传化为无符号整数

    QPainter painter(this);//实例化一个画家
    painter.setRenderHint(QPainter::Antialiasing, true);
    //准备画笔
    QPen pen;
    pen.setColor(QColor("black"));//设置颜色
    //给画家安排上画笔
    painter.setPen(pen);
    //设置画家坐标起点
    painter.translate(this->width()/2,this->height()/2);
    QBrush brush1(QColor("skyblue"));//刷子
    painter.setBrush(brush1);//给大圆填充
    //绘制一个圆
    painter.drawEllipse(QPoint(0,0),300,300);
    QBrush brush(QColor("red"));//刷子
    painter.setBrush(brush);//给节点填充
    //给中心点画一个节点
    painter.drawEllipse(QPoint(0,0),10,10);
    //绘制小时刻度线
    for(int i=0;i<12;i++)
    {
        pen.setColor(QColor("black"));
        pen.setWidth(3);
        painter.setPen(pen);
        painter.drawLine(QPoint(0,300),QPoint(0,280));//画一个长度20的直线
        painter.rotate(30);//旋转画家 30度
    }
    //绘制每五分钟刻度线
    for(int i=0;i<60;i++)
    {
        pen.setColor(QColor("black"));
        pen.setWidth(1);
        painter.setPen(pen);
        painter.drawLine(QPoint(0,300),QPoint(0,290));//画一个长度10的直线
        painter.rotate(6);//旋转画家 6度
    }
    painter.setPen(QColor(100,100,100));
    QFont font;
    font.setFamily("SimHei");
    font.setPointSize(16);
    painter.setFont(font);
    //绘制数字
    for(int i=0;i<12;++i)
    {
        QPointF point(0,0);
        painter.save();
        //计算并移动绘图对象中心点
        point.setX(250*qCos(((60-i*30)*3.14)/180)); //我看不懂 你写就对了
        point.setY(250*qSin(((60-i*30)*3.14)/180));  //我看不懂 你写就对了
        //计算并移动绘图对象的中心点
        painter.translate(point.x(),-point.y());
        //绘制路径
        painter.drawText(-15, -15, 30, 30,Qt::AlignCenter,QString::number(i+1));//我看不懂 你写就对了
        painter.restore();
    }
    //绘制小时指针
    QPainter painterH(this);
    painterH.translate(this->width()/2,this->height()/2);
    pen.setColor(QColor("red"));
    pen.setWidth(6);
    painterH.setPen(pen);
    painterH.rotate(hour*30+(minute/10)+second/10);
    painterH.drawLine(0,0,0,-90);

    //绘制分钟指针
    QPainter painterM(this);
    painterM.translate(this->width()/2,this->height()/2);
    pen.setColor(QColor("green"));
    pen.setWidth(4);
    painterM.setPen(pen);
    painterM.rotate(minute*6+second/60*6);
    painterM.drawLine(0,0,0,-120);

    //绘制秒指针
    QPainter painterS(this);
    painterS.translate(this->width()/2,this->height()/2);
    pen.setColor(QColor("blue"));
    pen.setWidth(2);
    painterS.setPen(pen);
    painterS.rotate(second*6);
    painterS.drawLine(0,0,0,-150);
}
//timeout信号的槽函数
void Widget::timeout_slot()
{
    update();
}

效果图

 

2、思维导图


http://www.kler.cn/news/305819.html

相关文章:

  • Android SDK和NDK的区别
  • SSH软链接后门从入门到应急响应
  • Redis的常见问题
  • 鸿蒙交互事件开发07——手势竞争问题
  • 速通GPT:《Improving Language Understanding by Generative Pre-Training》全文解读
  • 前端开发的观察者模式
  • K8s 之Pod的定义及详细资源调用案例
  • NAT技术
  • 人工智能辅助汽车造型设计
  • 健身管理|基于java的健身管理系统小程序(源码+数据库+文档)
  • 数据结构与算法图论 并查集
  • 【Linux】调试和Git及进度条实现
  • 弹框调取阿里云播放器一直报错 TypeError: 没有为播放器指定容器
  • 注意!Facebook已移除细分定位排除受众的功能
  • 基于微信小程序的宠物之家的设计与实现
  • 备战软考Day02-数据结构与算法
  • 深度学习| 快速上手深度学习代码的阅读和改写
  • 6.1 溪降技术:绳结
  • 小阿轩yx-Zabbix企业级分布式监控环境部署
  • 期望极大算法(Expectation Maximization Algorithm,EM)
  • 基于SpringBoot的校园新闻网站设计与实现
  • 视觉SLAM ch5——相机与图像
  • AIGC-初体验
  • python 大模型验证码识别
  • C++11的部分新特性
  • Vue路由:Vue router
  • 使用ESP8266和OLED屏幕实现一个小型电脑性能监控
  • 优化深度学习模型训练过程:提升PASCAL VOC 2012数据集上Deeplabv3+模型训练效率的策略
  • 【leetcode-python】最接近的三数之和
  • Acrobat 9 安装教程