實現極坐標圖表QPolarChart的角度軸范圍是[0,360]時,0度在水平右側

目錄

  • 參考
  • 角度軸范圍是[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_NAMESPACEclass QAbstractSeries;
class QAbstractAxis;class VPolarChart:public QChart
{Q_OBJECTQ_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;		// 角度軸elsereturn 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_OBJECTpublic: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.pswp.cn/news/161497.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161497.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161497.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

用eclipse搭建簡單的JavaWeb環境

在 Eclipse 中搭建 JavaWeb 項目的環境涉及到配置服務器、創建項目、添加庫等步驟。以下是基于 Eclipse 的 JavaWeb 項目搭建的簡要步驟&#xff1a; 步驟&#xff1a; 1. 安裝 Eclipse IDE for Java EE Developers 確保你已經安裝了 Eclipse IDE for Java EE Developers 版…

MyBatis-Plus: 簡化你的MyBatis應用

MyBatis-Plus: 簡化你的MyBatis應用 在Java開發中&#xff0c;MyBatis一直是一個受歡迎的持久層框架&#xff0c;提供了靈活的數據訪問方式。然而&#xff0c;MyBatis的使用往往涉及許多樣板代碼&#xff0c;這在一定程度上增加了開發的復雜性。這里&#xff0c;MyBatis-Plus&…

刷題筆記(第八天)

1. 請補全JavaScript代碼&#xff0c;實現一個函數&#xff0c;要求如下&#xff1a; 根據輸入的數字范圍[start,end]和隨機數個數"n"生成隨機數生成的隨機數存儲到數組中&#xff0c;返回該數組返回的數組不能有相同元素 注意&#xff1a; 不需要考慮"n"…

【C++11】auto與decltype關鍵字使用詳解

系列文章目錄 C11新特性使用詳解-持續更新 文章目錄 系列文章目錄前言一、auto關鍵字1.根據變量的初始化表達式來推導變量的類型2.const與引用 二、decltype關鍵字1.推斷表達式的類型2.const與引用 三、總結 前言 auto和decltype是C11引入的倆個重要的新關鍵字&#xff0c;用…

簡單幾步,借助Aapose.Cells將 Excel XLS 轉換為PPT

數據呈現是商業和學術工作的一個重要方面。通常&#xff0c;您需要將數據從一種格式轉換為另一種格式&#xff0c;以創建信息豐富且具有視覺吸引力的演示文稿。當您需要在幻燈片上呈現工作表數據時&#xff0c;需要從 Excel XLS 轉換為 PowerPoint 演示文稿。在這篇博文中&…

原理Redis-QuickList

QuickList **問題1&#xff1a;**ZipList雖然節省內存&#xff0c;但申請內存必須是連續空間&#xff0c;如果內存占用較多&#xff0c;申請內存效率很低。怎么辦&#xff1f; 為了緩解這個問題&#xff0c;我們必須限制ZipList的長度和entry大小。 **問題2&#xff1a;**但是…

[網鼎杯 2018]Fakebook

[網鼎杯 2018]Fakebook 打開環境出現一個登錄注冊的頁面 在登錄和注冊中發現 了地址欄出現變化&#xff0c;掃一波看看 看看robots.txt和flag.php 訪問robots.txt看看 再訪問user.php.bak <?php class UserInfo { public $name ""; public …

Head、Neck、Backbone介紹

在深度學習中&#xff0c;通常將模型分為三個部分&#xff1a;backbone、neck 和 head。 Backbone&#xff1a;backbone 是模型的主要組成部分&#xff0c;通常是一個卷積神經網絡&#xff08;CNN&#xff09;或殘差神經網絡&#xff08;ResNet&#xff09;等。backbone 負責…

ON1 Photo RAW 2024 for Mac——專業照片編輯的終極利器

ON1 Photo RAW 2024 for Mac是一款專為Mac用戶打造的照片編輯器&#xff0c;以其強大的功能和易用的操作&#xff0c;讓你的照片編輯工作變得輕松愉快。 一、強大的RAW處理能力 ON1 Photo RAW 2024支持大量的RAW格式照片&#xff0c;能夠讓你在編輯過程中獲得更多的自由度和更…

練習九-利用狀態機實現比較復雜的接口設計

練習九-利用狀態機實現比較復雜的接口設計 1&#xff0c;任務目的&#xff1a;2&#xff0c;RTL代碼3&#xff0c;RTL原理框圖4&#xff0c;測試代碼5&#xff0c;波形輸出 1&#xff0c;任務目的&#xff1a; &#xff08;1&#xff09;學習運用狀態機控制的邏輯開關&#xff…

【C++11】=default與=delete關鍵字使用詳解

系列文章目錄 C11新特性使用詳解-持續更新 文章目錄 系列文章目錄一、default關鍵字1. 為什么要引入default關鍵字2. 注意事項3. 使用default關鍵字有什么好處4.實例代碼 二、delete關鍵字1. 為什么要引入delete關鍵字2. 注意事項3. 使用場景3.1刪除默認構造函數3.2 刪除拷貝構…

2023.11.22 -數據倉庫的概念和發展

目錄 https://blog.csdn.net/m0_49956154/article/details/134320307?spm1001.2014.3001.5501 1經典傳統數倉架構 2離線大數據數倉架構 3數據倉庫三層 數據運營層,源數據層&#xff08;ODS&#xff09;&#xff08;Operational Data Store&#xff09; 數據倉庫層&#…

開發上門送桶裝水小程序要考慮哪些業務場景

上門送水業務已經有很長一段時間了&#xff0c;但是最開始都是給用戶發名片、貼小廣告&#xff0c;然后客戶電話訂水&#xff0c;水站工作人員再上門去送&#xff0c;這種人工記單和派單效率并不高&#xff0c;并且電話溝通中也比較容易出現偏差&#xff0c;那么根據這個情況就…

IT 領域中的主要自動化趨勢

48%的IT自動化流程屬于IT服務管理&#xff0c;過去一年中&#xff0c;IT運維自動化增長了272%。 IT部門從交付者轉變為戰略伙伴 今年的《工作自動化指數》數據顯示&#xff0c;自動化正在蔓延到組織的各個部門&#xff0c;越來越多的部門采用自動化&#xff0c;并且IT以外的員工…

一條命令徹底卸載Linux自帶多個版本jdk

一條命令徹底卸載Linux自帶多個版本jdk 檢查系統已經安裝的jdk rpm -qa | grep java卸載所有已經安裝的 jdk xargs 將參數逐個傳遞 將已安裝的 java 程序逐個當做參數傳遞給 rpm -e --nodeps rpm -qa | grep java | xargs rpm -e --nodeps再次檢查系統已經安裝的jdk rpm -qa | …

JS實現二分查找

最近在面試的時候被問到手寫實現二分查找&#xff0c;雖然二分查找很早就聽過&#xff0c;也知道實現原理&#xff0c;但是手擼起來&#xff0c;總是差點意思&#xff0c;正好復習一下。作為前端程序員&#xff0c;可能面試絕大部分公司不需要能寫很復雜的算法問題&#xff0c;…

Azure Machine Learning - 搜索中的語義排名

目錄 什么是語義排名&#xff1f;語義排名的工作原理如何收集和總結輸入語義排名的輸出如何對摘要進行評分 語義功能和限制 在 Azure AI 搜索中&#xff0c;“語義排名”通過使用語言理解對搜索結果重新排名來顯著提高搜索相關性&#xff0c; 本文概括性地介紹了語義排名工作原…

Nodejs JavaScript 字符串加密

情景 問題的場景是這樣的&#xff1a;我們需要在瀏覽器cookie中存儲用戶名&#xff0c;但又不想直接明文存儲&#xff0c;所以對它進行了簡單的加密存儲。 因為是簡單的加密&#xff0c;目的只是不希望明文存儲。我們使用了Base64 編碼&#xff0c;使得cookie里的存儲不可只讀…

Arthas 監聽 Docker 部署的java項目CPU占比高的信息

1、Linux上安裝Arthas wget https://alibaba.github.io/arthas/arthas-boot.jar2、docker ps 查看目標項目的容器ID 3、copy Arthas 到目標容器中 (注意有 &#x1f615; ) docker cp arthas-boot.jar d97e8666666:/4、進入到目標容器目錄中 docker exec -it d97e8666666 /b…

5-7求三種數的和

#include<stdio.h> int main(){double sum10;double sum20;double sum30;double sum;int i;for(i1;i<100;i){sum1sum1i;}printf("sum1結果是&#xff1a;%15.6f\n",sum1);for(i1;i<50;i){sum2sum2i*i;}printf("sum2結果是&#xff1a;%15.6f\n"…