Qt QGraphicsScene、QGraphicsView类实现仪表盘

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.mfbz.cn/a/33557.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

caffeine和google-guava cache缓存使用详解和源码介绍

google-guava cache 1.pom引入其依赖 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>20.0</version></dependency> 2.具体使用 com.google.common.cache.LoadingCache<Strin…

leetcode题集训 sql

目录 背景步骤175组合两个表&#xff08;多表联查&#xff09;176 177 第n高的薪水&#xff08;Distinct关键字 排序&#xff09;178分数排名 &#xff08;排序 order over关键字&#xff09;179 连续出现的数字 &#xff08;模拟多张表联查&#xff09;181. 超过经理收入的员工…

TCP/IP协议是什么?

78. TCP/IP协议是什么&#xff1f; TCP/IP协议是一组用于互联网通信的网络协议&#xff0c;它定义了数据在网络中的传输方式和规则。作为前端工程师&#xff0c;了解TCP/IP协议对于理解网络通信原理和调试网络问题非常重要。本篇文章将介绍TCP/IP协议的概念、主要组成部分和工…

Elasticsearch:使用 SIMD 指令加速向量搜索

作者&#xff1a;Chris Hegarty, Elastic Principal Engineer, Lucene PMC 翻译&#xff1a;杰瑞朱 多年来&#xff0c;Java 平台上运行的代码一直受益于自动向量化 —— HotSpot C2 编译器中的 superword 优化&#xff0c;将多个标量操作打包到 SIMD&#xff08;单指令多数据…

Git:git merge和git rebase的区别

分支合并 git merge是用来合并两个分支的。比如&#xff1a;将 b 分支合并到当前分支。同样git rebase b&#xff0c;也是把 b 分支合并到当前分支。他们的 「原理」如下&#xff1a; 假设你现在基于远程分支"origin"&#xff0c;创建一个叫"mywork"的分支…

【react全家桶学习】react的 (新/旧) 生命周期(重点)

目录 生命周期&#xff08;旧&#xff09; 挂载时的生命周期 constructor&#xff08;props&#xff09; componentWillMount&#xff08;&#xff09;-------------新生命周期已替换 render&#xff08;&#xff09; componentDidMount&#xff08;&#xff09;--- 组件…

PACS/RIS医学影像管理系统源码 提供先进图像处理和算法

PACS&#xff08;医学影像存档与通信系统&#xff09;主要应用于医学影像的存储、传输和显示。它可以使医生突破胶片的局限&#xff0c;对病人的影像进行全方位的处理和观察&#xff0c;以便得出更准确的诊断。同时&#xff0c;PACS可以节省大量的胶片&#xff0c;降低成本。医…

flex布局瀑布流占位两边对齐不对称

.page{display: flex;justify-content: space-between;flex-wrap: wrap; }.page:after {content: ;width: 400px; // 也可以 flex:1}

jmeter:BeanShell预处理程序获取/设置/引用变量

BeanShell预处理程序 1、局部变量 获取局部变量&#xff1a;vars.get("变量名") 设置局部变量&#xff1a;vars.put("变量名",变量值) 调用 ${变量名} 2、全局变量 获取局部变量&#xff1a;props.get("变量名") 设置局部变量&#xff1a…

KNIME工作流和节点比较功能

KNIME工作流和节点比较功能是一个在 << KNIME 视觉化数据分析 >> 中没有讲到的知识点。 KNIME工作流和节点比较功能在以下几种情况下非常有用&#xff1a; 版本控制&#xff1a;此功能可以跟踪工作流和节点中的更改。如果需要返回到之前的工作流或节点版本&#xf…

Vscode platformio Arduino开发STM32,点灯+串口调试

1.工具 USB-TTL(非常便宜&#xff0c;几块钱)STM32F103C8T6(几块钱) 2.引脚连线 USB-TTLSTM32TXPA10RXPA9VCC3.3VGNDGND 注意事项&#xff1a; 跳线帽位置&#xff1a;BOOT0接高电平(1)&#xff0c;BOOT1接低电平(0)每次上传程序前需要按一下复位键(之后&#xff0c;跳线帽…

2020年全国硕士研究生入学统一考试管理类专业学位联考逻辑试题——纯享题目版

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;考取过HCIE Cloud Computing、CCIE Security、CISP等证书。&#x1f433; &#x1f495;兴趣爱好&#xff1a;b站天天刷&#xff0c;题目常常看&a…

Nginx SSL使用自制证书

1. 生成证书 keytool -genkey -v -alias <Alias别名> -keyalg RSA -keystore <KeyStore文件> -validity <有效期> keytool -genkey -v -alias nginx -keyalg RSA -keystore nginx.keystore -validity 36500 alias别名为 nginxkeystore文件为 nginx.keystore…

【Nginx】第七章 Nginx原理与优化参数配置

7.1 Nginx原理 master-workers的机制的好处 首先&#xff0c;对于每个worker进程来说&#xff0c;独立的进程&#xff0c;不需要加锁&#xff0c;所以省掉了锁带来的开销&#xff0c;同时在编程以及问题查找时&#xff0c;也会方便很多。 其次&#xff0c;采用独立的进程&…

第11节 跟上板块轮动的节奏

板块 文章目录 板块什么是板块板块的分类板块的轮动 板块相关接口本节课任务 什么是板块 股票板块是一些具有相同特征的股票的集合&#xff0c;命名通常也会简单明了的直接按照特征命名。例如沪深300板块&#xff0c;蓝筹板块。对上市公司进行“分班”不论是对于企业还是对于投…

Restful风格笔记

Restful风格知识点 RestController注解 在类上添加RestController可以默认类中的所有方法都带有ResponseBody注解&#xff0c;可以省去一个个添加的麻烦。 RestController RequestMapping("/restful") //CrossOrigin(origins {"http://localhost:8080"…

Linux系统Centos7 安装MySQL8.0详细步骤

MySql安装 1.下载wget命令 yum -y install wget 2. 在线下载mysql安装包 wget https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm 3.MySQL的GPG升级了&#xff0c;需要更新&#xff0c;如果是新安装的MySQL&#xff0c;执行以下脚本即可&#xff1…

Python MongoDB复习第一章

Python 可以在数据库应用程序中使用。 最受欢迎的 NoSQL 数据库之一是 MongoDB。 MongoDB MongoDB 将数据存储在类似 JSON 的文档中&#xff0c;这使得数据库非常灵活和可伸缩。 为了能够测试本教程中的代码示例&#xff0c;您需要访问 MongoDB 数据库。 您可以在 https:/…

Vue.js中的状态管理:理解和使用Vuex

目录 前言 Vue.js 样式绑定 Vue.js class class 属性绑定 实例 1 实例 2 实例 3 实例 4 数组语法 实例 5 实例 6 Vue.js style(内联样式) 实例 7 实例 8 实例 9 Vue.js 组件 全局组件 全局组件实例 局部组件 局部组件实例 Prop Prop 实例 动态 Prop Pro…

力扣 98. 验证二叉搜索树

题目来源&#xff1a;https://leetcode.cn/problems/validate-binary-search-tree/description/ C题解1&#xff1a;中序遍历&#xff0c;递归法。获取数组&#xff0c;如果是递增则返回true&#xff0c;否则返回false。 class Solution { public:void zhongxu(TreeNode* node…