Qt QGraphicsScene、QGraphicsView类实现仪表盘

news2024/11/19 1:45:23

Qt QGraphicsScene、QGraphicsView类实现仪表盘

  • 【1】UI界面设计
  • 【2】效果
  • 【3】QGraphicsScene简介
  • 【4】QGraphicsEllipseItem简介
  • 【5】QGraphicsPolygonItem简介
  • 【6】QGraphicsLineItem简介
  • 【7】QGraphicsView简介
  • 【8】仪表源码
    • 头文件
    • 源码


【1】UI界面设计

在这里插入图片描述

【2】效果

在这里插入图片描述

【3】QGraphicsScene简介

QGraphicsScene是Qt框架中用于处理2D图形对象的类。它提供了一个虚拟的绘图区域,可以在其中添加、移动和管理图形项。QGraphicsScene能够管理大量的图形项,并且能够自动处理图形项的显示、剪辑、碰撞检测等功能。

使用QGraphicsScene,你可以创建和管理各种各样的2D图形对象,如矩形、椭圆、多边形、路径等。每个图形对象都是一个QGraphicsItem的子类,可以设置它们的位置、大小、旋转、颜色等属性。

QGraphicsScene提供了方法来添加、删除、查找图形项,以及处理图形项之间的交互。通过将图形项添加到场景中,你可以在图形视图中显示这些图形对象,并进行交互操作。

除了基本的图形对象,QGraphicsScene还支持添加自定义的图形项,你可以通过继承QGraphicsItem类来创建自己的图形项。这样,你可以实现更复杂的图形对象,以满足特定的需求。

总之,QGraphicsScene是Qt中用于管理和呈现2D图形对象的重要类,为开发者提供了灵活且强大的工具来创建丰富的图形用户界面。


【4】QGraphicsEllipseItem简介

QGraphicsEllipseItem是Qt框架中的一个图形项类,用于在QGraphicsScene中绘制椭圆形状的图形对象。它是QGraphicsItem的子类,继承了QAbstractGraphicsShapeItem类,因此具有绘制和编辑2D形状的能力。

使用QGraphicsEllipseItem,你可以在场景中创建和管理椭圆形状的图形对象。你可以指定椭圆的位置、大小、颜色、线条样式等属性,并可以通过设置椭圆的旋转角度来实现各种变换效果。

QGraphicsEllipseItem提供了一些方法来设置和获取椭圆的属性,比如setRect()、setPen()、setBrush()等。通过这些方法,你可以动态地修改椭圆的外观和位置。

除了基本的绘制能力,QGraphicsEllipseItem还支持与其他图形项的交互操作。你可以使用鼠标事件来捕获椭圆的点击、移动、悬停等操作,并根据需要进行相应的处理。

总之,QGraphicsEllipseItem是Qt中的一个用于绘制椭圆形状的图形项类,它提供了丰富的属性和方法,使开发者能够轻松地创建、编辑和交互椭圆形状的图形对象。


【5】QGraphicsPolygonItem简介

QGraphicsPolygonItem是Qt框架中的一个图形项类,用于在QGraphicsScene中绘制多边形形状的图形对象。它是QAbstractGraphicsShapeItem类的子类,因此具有绘制和编辑2D形状的能力。

使用QGraphicsPolygonItem,你可以在场景中创建和管理多边形形状的图形对象。你可以指定多边形的顶点坐标,设置线条样式、填充颜色等属性,并可以通过设置多边形的旋转角度来实现各种变换效果。

QGraphicsPolygonItem提供了一些方法来设置和获取多边形的属性,比如setPolygon()、setPen()、setBrush()等。通过这些方法,你可以动态地修改多边形的外观和位置。

除了基本的绘制能力,QGraphicsPolygonItem还支持与其他图形项的交互操作。你可以使用鼠标事件来捕获多边形的点击、移动、悬停等操作,并根据需要进行相应的处理。你还可以使用碰撞检测功能来判断多边形与其他图形项之间是否发生了碰撞。

总之,QGraphicsPolygonItem是Qt中的一个用于绘制多边形形状的图形项类,它提供了丰富的属性和方法,使开发者能够轻松地创建、编辑和交互多边形形状的图形对象。


【6】QGraphicsLineItem简介

QGraphicsLineItem是Qt框架中的一个图形项类,用于在QGraphicsScene中绘制直线形状的图形对象。它是QGraphicsItem的子类,继承了QAbstractGraphicsShapeItem类,因此具有绘制和编辑2D形状的能力。

使用QGraphicsLineItem,你可以在场景中创建和管理直线形状的图形对象。你可以指定直线的起点和终点坐标,设置线条样式、颜色等属性,并可以通过设置直线的旋转角度来实现各种变换效果。

QGraphicsLineItem提供了一些方法来设置和获取直线的属性,比如setLine()、setPen()等。通过这些方法,你可以动态地修改直线的外观和位置。

除了基本的绘制能力,QGraphicsLineItem还支持与其他图形项的交互操作。你可以使用鼠标事件来捕获直线的点击、移动、悬停等操作,并根据需要进行相应的处理。你还可以使用碰撞检测功能来判断直线与其他图形项之间是否发生了碰撞。

总之,QGraphicsLineItem是Qt中的一个用于绘制直线形状的图形项类,它提供了丰富的属性和方法,使开发者能够轻松地创建、编辑和交互直线形状的图形对象。


【7】QGraphicsView简介

QGraphicsView是Qt框架中的一个用于显示和管理图形场景的类。它是一个可视化的视图部件,允许用户在其中展示和操作一个或多个图形项。

QGraphicsView提供了一个可滚动和缩放的视图窗口,用于呈现QGraphicsScene中的图形内容。它可以根据需要自动调整视图的大小,使所有的图形项都能够显示在窗口内。

QGraphicsView作为一个容器窗口,可以在其中添加和管理多个图形项,包括例如QGraphicsItem、QGraphicsPixmapItem和QGraphicsTextItem等。开发者可以通过QGraphicsView提供的方法,来操作和管理这些图形项,例如移动、旋转、缩放、选择和删除等。

除了基本的图形项管理功能,QGraphicsView还提供了交互功能。开发者可以通过鼠标和键盘事件来捕捉和响应用户的操作,例如点击、双击、拖拽和滚动等。这样,开发者可以方便地实现与图形项的交互,例如选择、移动和编辑等。

另外,QGraphicsView还支持视图变换,开发者可以通过设置不同的视图矩阵来实现视图的平移、旋转、缩放和剪裁等效果。这样,开发者可以自由地控制和实现复杂的视觉效果。

总之,QGraphicsView是Qt框架中用于显示和管理图形场景的关键部件,它提供了丰富的功能和灵活的接口,开发者可以使用它来展示、操作和交互多个图形项,实现各种复杂的图形界面。

【8】仪表源码

头文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QDebug>

#include <QGraphicsScene>                    // 图形场景
#include <QGraphicsEllipseItem>             // 椭圆项
#include <QGraphicsPolygonItem>          // 多边形项
#include <QGraphicsLineItem>                // 直线项


QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

protected:
    void timerEvent(QTimerEvent *event);

private slots:

private:
    Ui::Widget *ui;
    // 用户自定义
    QGraphicsScene * scene;
    QGraphicsEllipseItem *outerCircle;          // 外圆
    QGraphicsEllipseItem *centerCircle;        // 中圆
    QGraphicsPolygonItem*polyonItem;      // 多边形
    QList<QGraphicsLineItem *>lines;         // 直线集合


};
#endif // WIDGET_H

源码

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

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

    qDebug()<<"x = "<<ui->graphicsView->x()<<" y = "<<ui->graphicsView->y();
    qDebug()<<"rx = "<<ui->graphicsView->pos().rx()<<" ry = "<<ui->graphicsView->pos().ry();
    // 创建图形场景对象
    scene = new QGraphicsScene(this);   // 指定父亲 好进行资源回收
    ui->graphicsView->setScene(scene);

    // 创建外框
    // 画的是矩形,以矩形中心点建立坐标系,x右侧为正数,左侧为负数 ;y上侧为负数,下侧负数。左上角为坐标起始原点
    outerCircle = new QGraphicsEllipseItem(QRectF(-120,-120,240,240));
    outerCircle->setPen(QPen(Qt::black,4));
    qDebug() << "outerCircle->zValue() = "<<outerCircle->zValue();      // 0
    scene->addItem(outerCircle);            // 添加外圆
    qDebug() << "outerCircle:" << outerCircle;

    // 创建中心点
    // 画的是矩形,以矩形中心点建立坐标系,x右侧为正数,左侧为负数 ;y上侧为负数,下侧负数。左上角为坐标起始原点
    centerCircle = new QGraphicsEllipseItem(QRectF(-15,-15,30,30));
    centerCircle->setBrush(QBrush(Qt::red));
    centerCircle->setPen(QPen(Qt::black, 2));
    // 一个z值较高的兄弟项目总是被画在另一个z值较低的兄弟项目之上。
    centerCircle->setZValue(1);
    scene->addItem(centerCircle);
    qDebug() << "centerCircle:" << centerCircle;

    // 创建指针
    QPolygonF polygon;
    polygon << QPointF(-10, 0) << QPointF(0, -120) << QPointF(10, 0);
    polyonItem = new QGraphicsPolygonItem(polygon);
    polyonItem->setBrush(QBrush(Qt::red));
    polyonItem->setPen(QPen(Qt::black, 2));
    // 一个z值较高的兄弟项目总是被画在另一个z值较低的兄弟项目之上。
    polyonItem->setZValue(2);
    polyonItem->setPos(0, 0);
    polyonItem->setRotation(0);
    scene->addItem(polyonItem);
    qDebug() << "polyonItem:" << polyonItem;

    // 创建刻度线 12个
    for (int i = 0; i < 12; i++) {
        QGraphicsLineItem *line = new QGraphicsLineItem(-100, 0, -80, 0); // 正左边第一条直线
        line->setPen(QPen(Qt::black, 3));
        line->setRotation(i * 30); // 围绕z轴设置顺时针旋转角度。
        line->setPos(0, 0);
        lines.append(line);
        scene->addItem(line);
    }

    // 启动定时器
    startTimer(1000);
}

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

void Widget::timerEvent(QTimerEvent *event)
{
    qDebug() << "Timer ID:" << event->timerId();
    static quint64 i = 0;
    ui->spinBox->setValue(i++);
    int angle = ui->spinBox->value();
    polyonItem->setRotation(angle);
}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/706694.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenStack(T版)——对象存储(Swift)服务介绍与安装

文章目录 OpenStack(T版)——对象存储(Swift)服务介绍与安装安装和配置(controller)准备安装和配置Swift对象存储服务组件创建账户 Ring创建容器 Ring创建对象 RingSwift 存储系统的主配置文件修改文件属主 安装和配置(compute)准备配置Swift对象存储服务组件 验证(1)加载环境变…

《程序员的AI书_从代码开始》第二章 手工实现神经网络

文章目录 2.1 感知器2.1.1 从神经元到感知器2.1.2 实现简单的感知器 2.1 感知器 2.1.1 从神经元到感知器 2.1.2 实现简单的感知器 class Perception(object):def __init__(self,eta0.01,iterations10):self.lr etaself.iterations iterationsself.w 0.0self.bias 0.0sel…

Red Hat宣布限制访问源代码,尚有两种方式可获取

日前Red Hat宣布限制访问Red Hat Enterprise Linux(RHEL)源代码&#xff0c;而此举也将影响AlmaLinux 、Rocky Linux 等下游发行版。 随即Rocky Linux发布了名为《Keeping Open Source Open》的博文。文中是这样说的&#xff1a;    Red Hat的**ERP**服务条款 (TOS) 和最终…

dotnet-dump/trace

一、dotnet-dump dotnet tool install -g dotnet-dump ps -ef | grep dotnet export PATH$PATH:$HOME/.dotnet/tools dotnet-dump collect --process-id 31555 #等待最后出输出&#xff1a;Writing full to /root/core_20230701_095230 #分析/root/core_20230701_095230文件 d…

【doxygen】支持 markdown 目录

文章目录 创建章节和子章节配置 doxygen Doxygen 不直接支持 Markdown 的 [toc] 语法。但是&#xff0c;你可以通过以下步骤手动创建目录&#xff1a; 创建章节和子章节 在 Markdown 文件中&#xff0c;使用标题标记&#xff08; # &#xff09;来创建章节和子章节。 Note:…

D2L运行环境问题+anaconda 多环境

环境问题 背景&#xff1a; 换了电脑&#xff0c;当前的电脑原先就装着Python3.9.0 直接pip install d2l & torch can work but when i start the jupyter, it use the anaconda SDK which is 3.6.4 so i need to install the d2l& torch under anaconda python sdk b…

第二章:Fast R-CNN网络详解

(目标检测篇&#xff09;系列文章目录 第一章:R-CNN网络详解 第二章:Fast R-CNN网络详解 第三章:Faster R-CNN网络详解 第四章:YOLO v1网络详解 第五章:YOLO v2网络详解 第六章:YOLO v3网络详解 文章目录 系列文章目录技术干货集锦前言一、摘要二、正文分析 1.引入库2.读…

10个最好的免费PDF阅读器清单分享

PDF&#xff08;便携式文档格式&#xff09;已成为数字文档分发和共享的事实上的标准。要高效地查看、注释和编辑 PDF 文件&#xff0c;可靠的 PDF 阅读器至关重要。在这篇综合文章中&#xff0c;我们将探讨当今可用的前 10 款 PDF 阅读器&#xff0c;评估它们的功能、可用性和…

网工内推 | 云平台运维专场,IE认证优先

01 中科创达 招聘岗位&#xff1a;云平台运维 职责描述&#xff1a; 1、驻场在客户单位处办公&#xff0c;负责H3C品牌的网络、安全、存储、云平台、服务器等软硬件设备的运行监控与管理&#xff0c;包括日常巡检、日常维护等工作&#xff1b; 2、技术支持&#xff0c;为客户…

各牌浏览器设置地址栏显示完整URL

有时候&#xff0c;我们在浏览器的地址栏输入URL后&#xff0c;需要查看完整的URL路径&#xff0c;比如想看到是http协议还是https协议。 目前大多数浏览器都直接将协议头隐藏&#xff0c;需要复制出地址&#xff0c;或者点击地址栏才能看到&#xff0c;比较麻烦。 浏览器支持通…

碳排放预测模型 | Python实现基于LR线性回归和MPR多项式回归的碳排放预测模型

文章目录 效果一览文章概述研究内容源码设计参考资料效果一览 文章概述 碳排放预测模型 | Python实现基于LR线性回归和MPR多项式回归的碳排放预测模型 研究内容 预测碳排放 查看汽车模型的数据集并预测其碳排放量。 在这里,使用线性回归和多项式回归进行预测,以找出哪个模型更…

【Python爬虫】Python爬虫三大基础模块(urllib BS4 Selenium)

【Python爬虫】Python爬虫三大基础模块&#xff08;urllib & BS4 & Selenium&#xff09; 文章目录 【Python爬虫】Python爬虫三大基础模块&#xff08;urllib & BS4 & Selenium&#xff09;一、Python爬虫的基本知识1、网络爬虫是什么&#xff1f;1&#xff0…

phpstudy nginx的解析漏洞分析

然后加入/.php 成功执行phpinfo(); 漏洞分析 这是我的生产环境,根据漏洞特性&#xff0c;大概率就是fastcgi的问题。 查看该站点相关的nginx的配置文件 可见 这里的正则处理,将文件传递给fastcgi处理&#xff0c;$fastcgi_script_name会被设置为1.png/.php&#xff0c;然后构…

kafka入门,Leader Partition 负载平衡(十五)

Leader Partition自动平衡 正常请款下&#xff0c;kafka本身会自动把Leader Partition均匀分散在个个机器上&#xff0c;来保证每台机器的读写吞吐量都是均匀的&#xff0c;但是如果某些broker宕机&#xff0c;会导致Leader partition过于集中在其他少部分几台broker上&#xf…

记录 Linux centos 安装tomact遇到的问题

如果在安装时 觉得自己什么都安装好了&#xff0c;什么也设置好了&#xff0c;包括阿里云的安全组&#xff0c;但是依旧不能进行访问Tomact的主页&#xff0c;你可以查看一下 catalina.out这个文件&#xff0c;出现以下错误这表示 tomact和Java本版有冲突所以一直无法访问&…

局域网内https证书mkcert安装

打开终端&#xff0c;输入如下命令下载mkcert&#xff1a; wget "https://dl.filippo.io/mkcert/latest?forlinux/amd64" -O mkcert && chmod x mkcert安装 mkcert需要依赖certutil&#xff0c;所以安装前需要先安装依赖包 CentOS/RHEL/Fedora/Alma/Rock…

VSCode调试通过CMakeLists.txt文件管理编译的项目

今天讲一下怎么用VS Code调试Cmake编译生成的项目&#xff0c;项目截图如下&#xff1a; 1、通过cmake生成可执行文件&#xff08;需要注意设置cmake生成debug版本&#xff0c;参考链接&#xff09;&#xff0c;如下图 之后生成可执行文件 2 VSCode切换到调试界面&#xff0c;点…

基于深度学习图像分割的墙体裂缝识别检测

直接上效果演示图&#xff1a; demo的演示视频和代码仓库看b站视频002期&#xff1a; 到此一游7758258的个人空间_哔哩哔哩_bilibili 代码展示界面 主要是01、02、03.py文件 运行01make_dataset.py文件能将图片数据转化成特定的格式。 自制数据集需要使用labelme工具对图片中…

一些可以参考的文档集合13

之前的文章集合: 一些可以参考文章集合1_xuejianxinokok的博客-CSDN博客 一些可以参考文章集合2_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合3_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合4_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合5_…

带你用Python制作一个经典必收藏的游戏:地铁跑酷(含完整代码)

名字&#xff1a;阿玥的小东东 学习&#xff1a;Python、C/C 主页链接&#xff1a;阿玥的小东东的博客_CSDN博客-python&&c高级知识,过年必备,C/C知识讲解领域博主 目录 一、游戏简介 二、游戏设计 引入必要的库 初始化游戏 定义游戏元素 定义游戏循环 更新游戏…