Qt绘图项目 - 简易表盘

废话少说,放码过来

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

protected:
   void paintEvent(QPaintEvent *event);

private:
    Ui::Widget *ui;
    QTimer *timer;
    int currentValue; //实现指针移动
    int mark = 0; // 控制指针的移动方向
};
#endif // WIDGET_H

widget.cpp

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

#include <QPainter>
#include <QTimer>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    timer = new QTimer(this);
    currentValue = 0;
    connect(timer,&QTimer::timeout,[=](){
    if(mark == 0){
      currentValue++;
      if(currentValue >= 60)
          mark = 1;
    }
    else if(mark ==1){
        currentValue--;
        if(currentValue <= 0)
            mark = 0;
    }


    update(); // 触发绘图事件
    });
   timer->start(30);

}

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

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    //设置抗锯齿
    painter.setRenderHints(QPainter::Antialiasing,true);
    //设置黑色的背景色
    painter.setBrush(Qt::black); // 设置 黑色的画刷
    painter.drawRect(rect());

    //坐标系,平移到中心
    painter.translate(rect().center());
    //设置渐变色
//    QRadialGradient radialGradient(0,0,height()/2);//渐变圆心,渐变半径
//    radialGradient.setColorAt(0.1,QColor(255,0,0,80));
//    radialGradient.setColorAt(1,QColor(255,0,0,250));
//    // 使用这个渐变色创建画刷
//    painter.setBrush(QBrush(radialGradient));
//    //画出渐变的(椭)圆  -- 大圆
//    painter.setBrush(Qt::NoBrush); // 丢弃渐变画刷
    painter.drawEllipse(QPoint(0,0),height()/2,height()/2);

    //画小圆
    painter.setPen(QPen(Qt::white,3)); //设置白色的画笔
    painter.drawEllipse(QPoint(0,0),60,60);

    //显示当前值:
    painter.setFont(QFont("华文宋体",20));
    painter.drawText(QRect(-60,-60,120,120),Qt::AlignCenter,QString::number(currentValue));

    //保存原点:
    painter.save(); // 三点钟方向

    //画刻度:

    //1.算出一个刻度需要的角度 270 度分成 50份
    double angle = 240*1.0/60; //需要先转为double类型,否则销售几乎部分会被吞掉造成误差
    //2.设置起始角度
    painter.rotate(150); // 从135度开始
    //设置字体样式:
    painter.setFont(QFont("华文宋体",13));
    //3.分类讨论 画出所有刻度
    for(int i=0;i<=60;++i){//包括0-  一共有51跟刻度线
        if(i%5 == 0){ // 被5 整除进一步细分表盘
            //画出长刻度上的数字标度
            if(150+angle*i < 240){ // 表盘左边数据翻转显示
            painter.rotate(180);
            painter.drawText(-(height()/2-20-10),8,QString::number(i*4));
            painter.rotate(-180);
            }
            else{//右边数据正常显示
            painter.drawText(height()/2-20-45,8,QString::number(i*4));
            }
            //画出一个长刻度
            painter.drawLine(height()/2-20,0,height()/2-3,0);

        }
        else{
            //画出一个长刻度
            painter.drawLine(height()/2-10,0,height()/2-3,0);
        }
        painter.rotate(angle);//选择angle的角度准备去画下一个刻度
    }

    //画指针 --> 线
    //先恢复到之前保存的原点:
    painter.restore();
    painter.save(); // 接着保存原点
    // 通过定时器去改变currentValue的值,去控制指针的移动
    painter.rotate(150+angle*currentValue); // 进行坐标系偏移
    painter.drawLine(60,0,height()/2-20-38,0); // 58

    //画扇形
    painter.restore();
    QRect rentangle(-height()/2,-height()/2,height(),height());
    painter.setPen(Qt::NoPen);
    painter.setBrush(QColor(255,128,64,150));

    painter.drawPie(rentangle,(-150)*16,-angle*currentValue*16);

}

效果演示

详细说明

画图准备- 背景

    QPainter painter(this);
    //设置抗锯齿
    painter.setRenderHints(QPainter::Antialiasing,true);
    //设置黑色的背景色
    painter.setBrush(Qt::black); // 设置 黑色的画刷
    painter.drawRect(rect());

坐标系平移

平移原点

    //坐标系,平移到中心
    painter.translate(rect().center());

平移坐标系弧度

    //2.设置起始角度
    painter.rotate(150); // 从135度开始

画大圆(渐变色)

   //设置渐变色
//    QRadialGradient radialGradient(0,0,height()/2);//渐变圆心,渐变半径
//    radialGradient.setColorAt(0.1,QColor(255,0,0,80));
//    radialGradient.setColorAt(1,QColor(255,0,0,250));
//    // 使用这个渐变色创建画刷
//    painter.setBrush(QBrush(radialGradient));
//    //画出渐变的(椭)圆  -- 大圆
//    painter.setBrush(Qt::NoBrush); // 丢弃渐变画刷
    painter.drawEllipse(QPoint(0,0),height()/2,height()/2);

画小圆

    //画小圆
    painter.setPen(QPen(Qt::white,3)); //设置白色的画笔
    painter.drawEllipse(QPoint(0,0),60,60);

原点保存和恢复

 
    painter.save(); //保存原点: 三点钟方向

       /* 中间经历了某种平移

   painter.rotate(150); // 从135度开始

      */

     painter.restore(); //恢复到之前保存的位置

画刻度

    //1.算出一个刻度需要的角度 270 度分成 50份
    double angle = 240*1.0/60; //需要先转为double类型,否则销售几乎部分会被吞掉造成误差
    //2.设置起始角度
    painter.rotate(150); // 从135度开始
    //设置字体样式:
    painter.setFont(QFont("华文宋体",13));
    //3.分类讨论 画出所有刻度
    for(int i=0;i<=60;++i){//包括0-  一共有61根刻度线
        if(i%5 == 0){ // 被5 整除进一步细分表盘
            //画出长刻度上的数字标度
            if(150+angle*i < 240){ // 表盘左边数据翻转显示
            painter.rotate(180);
            painter.drawText(-(height()/2-20-10),8,QString::number(i*4));
            painter.rotate(-180);
            }
            else{//右边数据正常显示
            painter.drawText(height()/2-20-45,8,QString::number(i*4));
            }
            //画出一个长刻度
            painter.drawLine(height()/2-20,0,height()/2-3,0);

        }
        else{
            //画出一个长刻度
            painter.drawLine(height()/2-10,0,height()/2-3,0);
        }
        painter.rotate(angle);//选择angle的角度准备去画下一个刻度
    }

画扇形

    //画扇形
    painter.restore();
    QRect rentangle(-height()/2,-height()/2,height(),height());
    painter.setPen(Qt::NoPen);
    painter.setBrush(QColor(255,128,64,150));

    painter.drawPie(rentangle,(-150)*16,-angle*currentValue*16);

定时器实现指针/扇形移动

构造函数里初始化定时器

timer = new QTimer(this);
    currentValue = 0;
    connect(timer,&QTimer::timeout,[=](){
    if(mark == 0){
      currentValue++;
      if(currentValue >= 60)
          mark = 1;
    }
    else if(mark ==1){
        currentValue--;
        if(currentValue <= 0)
            mark = 0;
    }


    update(); // 触发绘图事件
    });
   timer->start(30);


扇形移动

   // 通过定时器去改变currentValue的值,去控制指针的移动
    painter.rotate(150+angle*currentValue); // 进行坐标系偏移
    painter.drawLine(60,0,height()/2-20-38,0); // 58

    //画扇形
    painter.restore();
    QRect rentangle(-height()/2,-height()/2,height(),height());
    painter.setPen(Qt::NoPen);
    painter.setBrush(QColor(255,128,64,150));

    painter.drawPie(rentangle,(-150)*16,-angle*currentValue*16);

表盘中间显示 "速度"字样

    //显示当前值:
    painter.setFont(QFont("华文宋体",20));
    painter.drawText(QRect(-60,-60,120,120),Qt::AlignCenter,QString::number(currentValue));

### 回答1: Qt是一款流行的跨平台开发框架,可以用于开发各种类型的应用程序,包括智能家居系统。Qt提供了丰富的图形界面和应用程序逻辑开发工具,使得开发者可以轻松地创建用户友好的智能家居应用。以下是Qt作为简易智能家居框架的几个特点: 1. 跨平台性:Qt支持多种操作系统,如Windows、Linux和macOS,可以在不同的设备上运行,比如台式电脑、智能手机和平板电脑。这意味着开发者可以使用同一套代码来实现智能家居应用的跨平台兼容性,减少开发工作量。 2. 图形界面设计:Qt提供了丰富的图形界面设计工具,开发者可以使用Qt的可视化编辑器来创建用户友好的界面。智能家居系统通常需要一个易于操作的界面来控制家里的各种设备,Qt的图形界面设计工具可以帮助开发者轻松创建这样的界面。 3. 功能丰富的库:Qt提供了许多现成的功能库,如网络通信、数据库访问、多媒体处理等。这些功能库可以帮助开发者快速构建智能家居系统的各个模块,如设备控制、场景切换和数据存储。 4. 强大的事件处理机制:智能家居系统需要对各种事件进行处理,如用户的点击、设备的状态变化等。Qt提供了灵活的事件处理机制,可以方便地响应和处理这些事件,使得智能家居系统更加智能和灵活。 总之,Qt作为简易智能家居框架,具有跨平台性、图形界面设计、功能丰富的库和强大的事件处理机制等优势,可以帮助开发者快速创建用户友好、功能强大的智能家居应用程序。 ### 回答2: Qt是一种流行的跨平台开发框架,它为开发人员提供了丰富的工具和功能,使他们能够创建各种各样的应用程序。在智能家居领域,Qt可以作为一种简易的框架来构建智能家居解决方案。 首先,Qt具有跨平台的特性,这意味着开发人员可以使用同一套代码在不同的操作系统上运行其应用程序。这对于智能家居系统非常重要,因为它们通常需要在多个设备和平台上运行。使用Qt开发人员可以轻松地开发一次,并在不同平台上部署他们的应用程序。 其次,Qt提供了易于使用的图形用户界面(GUI)工具,使开发人员能够快速创建各种控件和界面元素。在智能家居系统中,有许多不同的设备和传感器需要进行交互和控制。Qt的GUI工具可以帮助开发人员创建直观和易于使用的用户界面,使用户可以轻松地管理和控制智能设备。 此外,Qt还提供了丰富的网络功能,使开发人员能够建立连接和通信。在智能家居系统中,各种设备和传感器需要相互通信,以实现自动化和远程控制。Qt的网络功能可以帮助开发人员轻松地建立设备之间的连接,实现数据传输和控制命令的发送。 最后,Qt还提供了强大的多媒体功能,可以用于处理音频和视频数据。在智能家居系统中,多媒体功能可以用于实现音乐播放、视频监控等功能。Qt的多媒体功能可以帮助开发人员轻松地处理和管理多媒体数据,为用户提供更好的体验。 综上所述,Qt作为一种简易的智能家居框架,具有跨平台能力、易用的GUI工具、丰富的网络功能和强大的多媒体功能。开发人员可以使用Qt来快速构建智能家居系统,并为用户提供更好的体验。 ### 回答3: Qt是一种跨平台的应用程序开发框架,简易智能家居框架指的是利用Qt开发的一种简单且智能的家居控制系统。这个框架可以让用户通过使用智能设备或者手机等终端设备来控制家中的各种设备,实现智能化的生活。 首先,这个框架可以提供一个直观易用的用户界面,让用户可以通过简单的操作就能控制家中各种设备。用户可以通过界面来控制灯光、温度、音乐、电视等各种家居设备的开关、亮度、颜色等参数。用户可以根据自己的需求自由定制界面的布局和样式,使其更符合个人喜好。 其次,这个框架可以实现智能化的控制逻辑。通过与传感器和执行器的连接,框架可以获取环境信息,例如温度、湿度、光线强度等,并根据用户的设定来智能地调节相应的家居设备。比如,可以设置在特定的时间或者特定的天气条件下自动开关灯光,或者根据家庭成员的习惯自动调整空调的温度,提高生活的舒适性。 另外,这个框架还可以实现设备之间的互联互通。通过适配不同的通信协议,比如Wi-Fi、蓝牙、红外等,框架可以将不同品牌、不同类型的智能设备连接在一起,并进行数据交换和联动控制。用户可以通过一个终端设备同时控制多个智能设备,实现一键控制多个设备的功能。 最后,这个框架还可以提供数据统计和分析的功能。框架可以记录各种设备的使用情况,并通过数据分析来提供用户的使用习惯和偏好,以及家居设备的能耗情况等信息,帮助用户优化家居设备的使用,节省能源和成本。 总之,Qt简易智能家居框架提供了丰富的功能和智能化的操作,使用户可以更加方便地控制家中的设备,提高生活的舒适度和便捷性。它不仅满足用户对智能家居的需求,还可以帮助用户节约能源和成本,是一种十分实用的智能家居解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值