实现极坐标图表QPolarChart的角度轴范围是[0,360]时,0度在水平右侧

news2025/1/13 19:54:51

目录

  • 参考
  • 角度轴范围是[0,360]时,0度在水平右侧
  • .h
  • .cpp

参考

Qt数据可视化(QPolarChart雷达图)

默认QPolarChart的范围是[0,360]时,0度在垂直上方
如官方例子QValueAxis角度轴范围是[-100,100]
在这里插入图片描述

角度轴范围是[0,360]时,0度在水平右侧

在这里插入图片描述



  • 原理:
  • 角度轴使用范围改为[-90,270],此时0度在水平右侧
  • 使用分类轴QCategoryAxis 代替 数值轴QValueAxis 重新指定 -90 到 0 度之间的标签;

注意:此方法只能实现简单效果;
复杂效果可以使用QGraphicsView实现顺时针旋转90°(此方法本人在开发遇到缩放比例问题就没有使用)
参考:qt界面旋转

.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPolarChart>
#include <QChartView>
#include <QScatterSeries>
#include <QList>
#include <QDebug>
#include <QLineSeries>
#include <QTimer>

#include <QtCharts/QPolarChart>
#include <QtCharts/QAbstractAxis>
#include <QtCharts/QChart>
#include <QtCharts/QValueAxis>
#include <QtCharts/QCategoryAxis>
#include <QtCharts/QAbstractAxis>
QT_CHARTS_USE_NAMESPACE

/*****************************************自定义***********************************************************/
QT_CHARTS_BEGIN_NAMESPACE

class QAbstractSeries;
class QAbstractAxis;

class VPolarChart:public QChart
{
    Q_OBJECT
	Q_ENUMS(PolarOrientation)
	Q_FLAGS(PolarOrientations)

public:
	enum PolarOrientation {
		PolarOrientationRadial = 0x1,	// 径向轴,Y:到圆心距离
		PolarOrientationAngular = 0x2	// 角度轴,X:角度 
	};
	Q_DECLARE_FLAGS(PolarOrientations, PolarOrientation)
public:
    VPolarChart(QGraphicsItem* parent = nullptr, Qt::WindowFlags wFlags = Qt::WindowFlags()) 
        : QChart(QChart::ChartTypePolar, parent, wFlags)
    {

    };
    ~VPolarChart() {};

	// 径向轴
	void addRadialAxis(QValueAxis* radialAxis)
	{
		if (radialAxis == nullptr || radialAxis->type() == QAbstractAxis::AxisTypeBarCategory) {
			qWarning("QAbstractAxis::AxisTypeBarCategory is not a supported axis type for polar charts.");
			return;
		}
		QChart::addAxis(radialAxis, Qt::AlignLeft);
	}
	
	// 角度轴
	void addAngularAxis(QCategoryAxis* angularAxis)
	{
		if (angularAxis == nullptr || angularAxis->type() == QAbstractAxis::AxisTypeBarCategory) {
			qWarning("QAbstractAxis::AxisTypeBarCategory is not a supported axis type for polar charts.");
			return;
		}
		angularAxis->setMin(-90);
		angularAxis->setMax(270);
		angularAxis->setStartValue(-90);
		if (angularAxis->categoriesLabels().isEmpty()
			|| angularAxis->categoriesLabels().size() < 9)
		{
			angularAxis->append("270", -90); // 添加极坐标的角向标签
			angularAxis->append("315", -45);
			angularAxis->append("0", 0);
			angularAxis->append("45", 45);
			angularAxis->append("90", 90);
			angularAxis->append("135", 135);
			angularAxis->append("180", 180);
			angularAxis->append("225", 225);
			angularAxis->append("270", 270);
		}
		angularAxis->setLabelsPosition(QCategoryAxis::AxisLabelsPositionOnValue); // 设置标签位置
		QChart::addAxis(angularAxis, Qt::AlignBottom);
	}

    QList<QAbstractAxis*> axes(PolarOrientations polarOrientation = 
		PolarOrientations(PolarOrientationRadial | PolarOrientationAngular), 
        QAbstractSeries* series = nullptr) const 
    {
		Qt::Orientations orientation(0);
		if (polarOrientation.testFlag(PolarOrientationAngular))		// 角度轴, X:角度
			orientation |= Qt::Horizontal; 
			if (polarOrientation.testFlag(PolarOrientationRadial))	// 径向轴,Y:到圆心距离
			orientation |= Qt::Vertical;

		return QChart::axes(orientation, series);
    };

    static PolarOrientation axisPolarOrientation(QAbstractAxis* axis) {
		if (axis && axis->orientation() == Qt::Horizontal)
			return PolarOrientationAngular;		// 角度轴
		else
			return PolarOrientationRadial;		// 径向轴
    };

private:
    Q_DISABLE_COPY(VPolarChart)
};

class VScatterSeries :public QScatterSeries
{
public:
	VScatterSeries(QObject* parent = nullptr) :QScatterSeries(parent) {};
	~VScatterSeries() {};

	void insert(qreal x, qreal y) {
		x = x > 270 ? x - 360 : x;
		QXYSeries::append(x,y);
	}
private:
};

QT_CHARTS_END_NAMESPACE

/*****************************************自定义***********************************************************/

class Widget : public QWidget {
    Q_OBJECT

   public:
    Widget(QWidget *parent = 0);
    ~Widget();
    void initConnect();
    void timeout();

   private:
    VPolarChart*m_ptrChart;            // 极坐标图
    QChartView *m_ptrChartview;
    QTimer *m_ptrTime;
    qreal m_rangle;                     // 角
};

#endif  // WIDGET_H

.cpp

#include "widget.h"

#include <QSplineSeries>

Widget::Widget(QWidget* parent)
	: QWidget(parent)
	, m_ptrChart(new VPolarChart)
	, m_ptrChartview(new QChartView(m_ptrChart, this))
	, m_ptrTime(new QTimer)
	, m_rangle(0)
{
	// 抗锯齿
	m_ptrChartview->setRenderHint(QPainter::Antialiasing);
	// 动画
	m_ptrChart->setAnimationOptions(QChart::GridAxisAnimations);
	// 表示曲线
	QSplineSeries* s = new QSplineSeries();
	s->append(0, 0);
	s->append(m_rangle, 270);
	
	VScatterSeries* series = new VScatterSeries();		// 创建一个散点绘图数据集对象

	const qreal angularMax = 270;						// 最大角度
	series->setName("散点");
	for (int i = 0; i < angularMax; i += 10) {
		series->insert(i, i);							// 向series中添加数据,X:角度 Y:到圆心距离
	}
// 	series->setPointLabelsVisible(true); 
// 	series->setPointLabelsFormat("(@xPoint, @yPoint)"); 

	m_ptrChart->legend()->setVisible(true);				// 隐藏图例

	//径向轴Y:到圆心距离
	QValueAxis* radialAxis = new QValueAxis();
	radialAxis->setTickCount(3);
	radialAxis->setLabelFormat("%d");
	m_ptrChart->addRadialAxis(radialAxis);

	//角度轴X:角度 
	QCategoryAxis* angularAxis = new QCategoryAxis();
	angularAxis->setShadesVisible(true);				// 阴影
	angularAxis->setShadesBrush(QBrush(QColor(249, 249, 255)));

	m_ptrChart->addAngularAxis(angularAxis);

	m_ptrChartview->setFixedSize(500, 500);				//  QChartView 的大小设置为 500x500 像素

	m_ptrChart->addSeries(series);						// 将创建的series添加进图表中
	m_ptrChart->addSeries(s);

	series->attachAxis(angularAxis);
	series->attachAxis(radialAxis);
	s->attachAxis(angularAxis);
	s->attachAxis(radialAxis);
	
	initConnect();
	m_ptrTime->start(100);
}
void Widget::initConnect()
{
	connect(m_ptrTime, &QTimer::timeout, this, &Widget::timeout);
}

void Widget::timeout()
{
	qInfo() << "start timeout";
	foreach(auto * serie, m_ptrChart->series()) {
		if (serie == nullptr) continue;

		//qInfo() << "item->type()" << item->type();
		if (serie->type() == QSplineSeries::SeriesTypeSpline) {
			//清空曲线系列的数据点
			dynamic_cast<QSplineSeries*>(serie)->clear();

			m_rangle = (m_rangle >= 270)?(-90.): m_rangle+1.5;

			//向曲线系列中添加数据点
			dynamic_cast<QSplineSeries*>(serie)->append(0, 0);
			dynamic_cast<QSplineSeries*>(serie)->append(m_rangle, 270);
			
		}
	}
}
Widget::~Widget() {}

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

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

相关文章

5-8输出水仙花数

#include<stdio.h> int main(){int i,j,k;int n;for(n100;n<1000;n){in/100;jn/10-i*10;kn%10;if(ni*i*ij*j*jk*k*k)printf("%d ",n);}printf("\n");return 0; }

以太坊铭文聚合交易平台 Scorpio,铭文爆发的新推手?

在今年 3 月&#xff0c;Ordinals 凭空问世&#xff0c;定义了一套在比特币网络运行的序数协议&#xff0c;使得 Token 和 NFT 能在比特币网络上实现并稳定运行&#xff0c;拉来了比特币铭文市场的新序幕。而在此后&#xff0c;在包括 BRC20 等在内的一系列应用的出现&#xff…

基于SSM的旅游管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

自动解决IP冲突的问题 利用批处理更改末位IP循环+1直到网络畅通为止 解放双手 事半功倍

好久没出来写点什么了&#xff0c;难道今天有点时间&#xff0c;顺便把这两天碰到的问题出个解决方法吧。 这几天去客户那儿解决网络问题&#xff0c;因为客户的网络是固定的静态IP&#xff0c;因为没做MAC绑定&#xff0c;IP固定在本地电脑上&#xff0c;只要上不了网&#xf…

[Linux] shell脚本之循环

一、循环定义 一组被重复执行的语句称之为 循环体,能否继续重复,决定循环的终止条件。 循环语句 是由循环体及循环的终止条件两部分组成的。 二、for循环 2.1 带列表循环 语法 for 变量名 in 取值列表do 命令序列 done 花括号用法&#xff1a; 花括号{ }和seq在for循环…

结构体与指针_sizeof_static_extern_函数指针数组_函数指针_回调函数

一、结构体与指针 #include <stdint.h> #include <stdlib.h> #include <stdio.h> #define up_to_down(uuu) (downdemo_t *)(uuu->beg) #define __plc__ typedef struct updemo_s{uint8_t *head;uint8_t *beg;uint8_t *end; }updemo_t; typedef struct do…

PCIE链路训练-状态机描述1

状态机描述 Config.linkwidth.start&#xff1a; 1. &#xff08;1&#xff09;Linkup 0 状态机没有执行链路宽度的升级&#xff08;upconfiguration of the Link width&#xff09;&#xff1a;那么tx会在所有active的dsp上发送TS1&#xff0c;其中link num为具体内容&a…

校园圈子论坛,交友,帖子内短视频,二手市场,APP小程序H5三端交付,源码交付,支持二开

校园圈子论坛&#xff0c;交友频道&#xff0c;商城&#xff0c;二手市场&#xff0c;活动专区&#xff0c;短视频&#xff0c;从校园生活的方方面面展现出了充满活力和创造力的镜头。这个频道是一个让学生们相互交流、结识新朋友的平台&#xff0c;不仅有交友功能&#xff0c;…

【Django-DRF】多年md笔记第5篇:Django-DRF的Request、Response和视图详解

本文从分析现在流行的前后端分离Web应用模式说起&#xff0c;然后介绍如何设计REST API&#xff0c;通过使用Django来实现一个REST API为例&#xff0c;明确后端开发REST API要做的最核心工作&#xff0c;然后介绍Django REST framework能帮助我们简化开发REST API的工作。 Dj…

『亚马逊云科技产品测评』活动征文|AWS 数据库产品类别及其适用场景详细说明

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 目录 前言、AWS 数据库产品类别 01、Amazon Aurora 02、Amazon Docum…

链表OJ--上

文章目录 前言一、反转链表二、移除链表元素三、链表中倒数第K个结点四、相交链表五、链表的中间结点 前言 一、反转链表 力扣206&#xff1a;反转链表- - -点击此处传送 思路图&#xff1a; 方法一&#xff1a;改变指向 方法二&#xff1a; 代码&#xff1a; //方法一 /…

逸学java【初级菜鸟篇】9.5枚举

hi&#xff0c;我是逸尘&#xff0c;一起学java吧 枚举是信息的标志和分类 当一个变量有几种固定可能的取值时&#xff0c;就可以将它定义为类型的枚举。 优点&#xff1a;代码可读性好&#xff0c;入参约束严谨&#xff0c;代码优雅&#xff0c;是最好的信息分类技术&#x…

基于STM32的数字图像处理与模式识别算法优化

基于STM32的数字图像处理与模式识别算法优化是一项涉及图像处理和机器学习领域的研究任务&#xff0c;旨在实现高效的图像处理和模式识别算法在STM32微控制器上的运行。本文将介绍基于STM32的数字图像处理与模式识别算法优化的原理和实现步骤&#xff0c;并提供相应的代码示例。…

php文件上传例子

目录结构&#xff1a; index.html代码&#xff1a; <!DOCTYPE html> <html><head><title>文件上传</title><meta charset"utf-8"></head><body><form action"./up.php" method"post" encty…

【中间件】服务化中间件理论intro

中间件middleware 内容管理 intro服务化middleware架构注册中心intro服务治理系统intro 本文主要intro服务化中间件的探讨 去年cfeng写了一篇博客走马观花般阐述了Spring Cloud下面的各种中间件&#xff0c;连深入使用都谈不上&#xff0c;只能说intro&#xff0c;在实际work中…

leetcode:520. 检测大写字母

一、题目&#xff1a; 链接&#xff1a;520. 检测大写字母 - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a;bool detectCapitalUse(char* word) 二、思路&#xff1a; 本题较为简单&#xff0c;分为三种情况&#xff1a; 1.首字母大写&#xff0c;其余小写 2.首字…

Navmesh 寻路

用cocos2dx引擎简单实现了一下navmesh的多边形划分&#xff0c;然后基于划分多边形的a*寻路。以及路径拐点优化算法 用cocos主要是方便使用一些渲染接口和定时器。重点是实现的原理。 首先画了一个带有孔洞的多边形 //多边形的顶点数据Vec2(100, 100),Vec2(300, 200),Vec2(50…

Python Pyvis库详解:创建交互式网络图

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是涛哥&#xff0c;今天为大家分享 Python Pyvis库详解&#xff1a;创建交互式网络图&#xff0c;文章4000字&#xff0c;阅读大约15分钟&#xff0c;大家enjoy~~ Pyvis是一个基于JavaScript库NetworkX的Pytho…

[开源]Web端的P2P文件传输工具,简单安全高效的P2P文件传输服务

一、开源项目简介 小鹿快传 - 在线P2P文件传输工具 小鹿快传是一款Web端的P2P文件传输工具&#xff0c;使用了WebRTC技术实现P2P连接和文件传输。 二、开源协议 使用MIT开源协议 三、界面展示 产品截图 四、功能概述 简单安全高效的P2P文件传输服务 小鹿快传是一款Web端…

80基于matlab的小波包熵与模糊C均值聚类的故障诊断,以凯斯西储大学轴承数据为例进行分析

基于matlab的小波包熵与模糊C均值聚类的故障诊断&#xff0c;以凯斯西储大学轴承数据为例进行分析。对数据进行小波包分解后重构&#xff0c;然后提取各频带能量分布&#xff0c;后计算小波包熵进行故障诊断。输出特征可视化结果。数据可更换自己的&#xff0c;程序已调通&…