From 3cf3c88b1e11c8989ac9dfb58456c53ba0f272ab Mon Sep 17 00:00:00 2001 From: duanshengchao <519970194@qq.com> Date: Thu, 7 Aug 2025 11:48:08 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=A2=9E=E5=8A=A0=E2=80=98=E5=9B=BE?= =?UTF-8?q?=E4=BE=8B=E2=80=99=E7=9A=84=E6=98=BE=E7=A4=BA/=E9=9A=90?= =?UTF-8?q?=E8=97=8F=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dataPanel/dpBaseChart.h | 2 ++ dataPanel/dpConfigurationDialog.cpp | 9 ++++++++ dataPanel/dpConfigurationDialog.h | 1 + dataPanel/dpGlobals.h | 2 ++ dataPanel/dpLineChart.cpp | 34 +++++++++++++++++++++++++++- dataPanel/dpLineChart.h | 2 ++ resource/PowerMaster.qrc | 2 ++ resource/images/ico_switch_off.png | Bin 0 -> 2516 bytes resource/images/ico_switch_on.png | Bin 0 -> 2098 bytes ui/dpConfigurationDialog.ui | 33 +++++++++++++++++++++++++++ 10 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 resource/images/ico_switch_off.png create mode 100644 resource/images/ico_switch_on.png diff --git a/dataPanel/dpBaseChart.h b/dataPanel/dpBaseChart.h index 41c73c5..33cae5d 100644 --- a/dataPanel/dpBaseChart.h +++ b/dataPanel/dpBaseChart.h @@ -104,12 +104,14 @@ protected: QString dataID; QString synchronizeTagging; //同步配置数据时的标记,new、update两种,没有的就是要被删除 + QString name; //用户legend图例展示用 Graph() { dataID = ""; //qGraph = nullptr; synchronizeTagging = "noTagging"; + name = ""; } }; }; diff --git a/dataPanel/dpConfigurationDialog.cpp b/dataPanel/dpConfigurationDialog.cpp index 0c5ad34..a92fec5 100644 --- a/dataPanel/dpConfigurationDialog.cpp +++ b/dataPanel/dpConfigurationDialog.cpp @@ -64,6 +64,8 @@ void dpConfigurationDialog::initialize() connect(ui->btnReomve_type, SIGNAL(clicked()), this, SLOT(onBtnClicked_remove_type())); connect(ui->btnReomve_source, SIGNAL(clicked()), this, SLOT(onBtnClicked_remove_source())); + //connect(ui->radioBtn_showLegend, &QRadioButton::toggled, this, &dpConfigurationDialog::onRadioBtnToggled); + connect(ui->typeSourceList, &QListView::clicked, this, &dpConfigurationDialog::onItemClicked_typeSource); connect(ui->dataSourceList, &QListView::clicked, this, &dpConfigurationDialog::onItemClicked_dataSource); @@ -246,6 +248,7 @@ void dpConfigurationDialog::setPanel(DataPanel* pPanel) // ui->typeSelectedList->setModel(m_pModel_typeSelected); ui->serviceIP->setText(pPanel->m_cofigurationResults.dataServiceIP); ui->servicePort->setText(QString::number(pPanel->m_cofigurationResults.dataServicePort)); + ui->radioBtn_showLegend->setChecked(pPanel->m_cofigurationResults.showLegend); DataPanelType panelType = pPanel->getType(); switch (panelType) @@ -335,6 +338,7 @@ void dpConfigurationDialog::onBtnClicked_confirm() copyModelData(m_pModel_dataSelected, m_pDataPanel->m_cofigurationResults.m_pModel_dataSource); m_pDataPanel->m_cofigurationResults.dataServiceIP = ui->serviceIP->text(); m_pDataPanel->m_cofigurationResults.dataServicePort = ui->servicePort->text().toInt(); + m_pDataPanel->m_cofigurationResults.showLegend = ui->radioBtn_showLegend->isChecked(); m_pDataPanel->m_cofigurationResults.arrangement = (AxisArrangementMode)ui->axisArrangement->currentIndex(); m_pDataPanel->m_cofigurationResults.axisCfgMap = m_axisCfgMap; m_pDataPanel->configurationComplete(); @@ -550,3 +554,8 @@ void dpConfigurationDialog::onBtnClicked_remove_source() removeDataSelected(nCurrentRow); } } + +void dpConfigurationDialog::onRadioBtnToggled(bool checked) +{ + +} diff --git a/dataPanel/dpConfigurationDialog.h b/dataPanel/dpConfigurationDialog.h index 03a6096..64e6191 100644 --- a/dataPanel/dpConfigurationDialog.h +++ b/dataPanel/dpConfigurationDialog.h @@ -33,6 +33,7 @@ public slots: void onBtnClicked_cancle(); void onBtnClicked_remove_type(); void onBtnClicked_remove_source(); + void onRadioBtnToggled(bool checked); void onItemClicked_typeSource(const QModelIndex&); void onItemClicked_dataSource(const QModelIndex&); diff --git a/dataPanel/dpGlobals.h b/dataPanel/dpGlobals.h index 133d87e..ace87d9 100644 --- a/dataPanel/dpGlobals.h +++ b/dataPanel/dpGlobals.h @@ -40,6 +40,7 @@ struct configurationResults QStandardItemModel* m_pModel_dataSource; QString dataServiceIP; int dataServicePort; + bool showLegend; AxisArrangementMode arrangement; QHash axisCfgMap; //可能有多个轴(数据类别) @@ -51,6 +52,7 @@ struct configurationResults dataServiceIP = "127.0.0.1"; dataServicePort = 1987; + showLegend = false; arrangement = AlternateSides; } diff --git a/dataPanel/dpLineChart.cpp b/dataPanel/dpLineChart.cpp index a596e8f..3df38db 100644 --- a/dataPanel/dpLineChart.cpp +++ b/dataPanel/dpLineChart.cpp @@ -11,6 +11,7 @@ dpLineChart::dpLineChart(QWidget* parent) m_timeRange = 60 * 1000; m_axisArrangementMode = AlternateSides; + m_showLegend = false; m_updateData = false; QBoxLayout* mainLayout = new QBoxLayout(QBoxLayout::LeftToRight); @@ -80,6 +81,13 @@ void dpLineChart::initQCP() //qDebug() << timeTicker->dateTimeFormat(); m_pCustomPlot->xAxis->setTicker(timeTicker); //qDebug() << m_pCustomPlot->xAxis->range(); + + //Legend + m_pCustomPlot->legend->setBrush(QBrush(QColor(255,255,255,12))); //背景透明 + m_pCustomPlot->legend->setBorderPen(QPen(QColor(255,255,255,0))); //边框透明 + m_pCustomPlot->legend->setFont(m_chartStyle.labelFont); + m_pCustomPlot->legend->setTextColor( m_chartStyle.labelColor); + m_pCustomPlot->axisRect()->insetLayout()->setInsetAlignment(0, Qt::AlignRight|Qt::AlignTop); } void dpLineChart::arrangeAxes() @@ -131,6 +139,26 @@ void dpLineChart::arrangeAxes() } } +void dpLineChart::reLayoutLegend() +{ + if(!m_showLegend) + return; + + //图例放在最右侧纵坐标轴的右侧 + //1.找到最右侧坐标轴 + QCPAxis* rightmostAxis = m_pCustomPlot->yAxis2; + int offset = rightmostAxis->offset(); + QList axes = m_pCustomPlot->axisRect()->axes(QCPAxis::atRight); + for(QCPAxis* axis : axes) + { + if(axis->offset() > rightmostAxis->offset()) + rightmostAxis = axis; + } + //2.设置图例位置 + QCPLegend* legend = m_pCustomPlot->legend; + +} + void dpLineChart::setTimeRange(TimeUnit unit) { switch(unit) @@ -406,9 +434,11 @@ void dpLineChart::synchronizeConfigData(const configurationResults& cfg) graph.dataID = graphID; graph.dataType = dataType; graph.synchronizeTagging = "new"; + graph.name = cfg.m_pModel_dataSource->item(i, 0)->text(); QCPGraph* newGraph = m_pCustomPlot->addGraph(m_pCustomPlot->xAxis, valueAxis); if(newGraph) { + newGraph->setName(graph.name); if(colorData.isValid()) { QColor color = colorData.value(); @@ -449,9 +479,11 @@ void dpLineChart::synchronizeConfigData(const configurationResults& cfg) if( !m_pCustomPlot->removeGraph(g.qGraph) ) qWarning() << "Failed to remove gracloxne ph:" << key; } - //qDebug() << "graph count: " << m_graphs.count() << ", " << m_pCustomPlot->graphCount(); + //Legend + m_pCustomPlot->legend->setVisible(cfg.showLegend); + m_updateData = true; } diff --git a/dataPanel/dpLineChart.h b/dataPanel/dpLineChart.h index 1a3bc74..1190f9e 100644 --- a/dataPanel/dpLineChart.h +++ b/dataPanel/dpLineChart.h @@ -42,6 +42,7 @@ private: void initQCP(); void arrangeAxes(); + void reLayoutLegend(); //void handleAssociatedGraphs(); QCustomPlot* m_pCustomPlot; @@ -51,6 +52,7 @@ private: QVector m_axes; QHash m_graphs; AxisArrangementMode m_axisArrangementMode; + bool m_showLegend; bool m_updateData; }; diff --git a/resource/PowerMaster.qrc b/resource/PowerMaster.qrc index f2257b3..276c479 100644 --- a/resource/PowerMaster.qrc +++ b/resource/PowerMaster.qrc @@ -1,5 +1,7 @@ + images/ico_switch_off.png + images/ico_switch_on.png images/down-arrow.png images/branch_closed.png images/branch_open.png diff --git a/resource/images/ico_switch_off.png b/resource/images/ico_switch_off.png new file mode 100644 index 0000000000000000000000000000000000000000..dba9e3fe4a0468beedf3ac22a33eeac6ed3d9e9a GIT binary patch literal 2516 zcmY*bd0Z3M79KW<$TA8-tRRbQseupzLJ~G(M2viYAqfz|W)k))E|Eo3s1me- zC|kftMFdenGzbC;6;QANqR3M*U?8BhLPfAcpTEBM{~zKxdB+kpj&=(6EKAfu7V&ttQZ7i{xY$0~bY$a*kv$ob4iM z7=|4h&7j%Q7#Or21A}3>IHO%1qtKBSU(54YQU9%oum&UL@Blx2|j1w?9gd zGagG^OiAvaQr1fPu+(IwN?LDq*G@tXbO-ne0MvlMVHXP!ND`oT z!j{7j$ol#Pwe>rDf=FxY6vyQ0XTWx6^0vJQcK{He zCoY5$U{q;xg(727VWDQO&Iir-N95^D!FxF&*HchX;0asuD6m`W}dYZFppUAd}JiVr)DrTGZRm?++g2zTMIDb*PrUF=$YV*J$-tnCF{%K=gBV)^fve$ zs@kQ~1?N#UUoHd*DH4;-o0qu5HovY*#XCB3Al{qI)#dZ)Bcr1&I0pwnQ`fjGkJwIx zZK9C;NmpymQ?wkqj-c0w0-J-8Z{=^_YBe@CricSa*&&9yUwnli!E4ZI&TWW}&Pha=%#*Vy8~NrfT|%X#C|7%#gjK#yOL)Q>^Oq-gQMe_cIb`l2;` z@cjAnBVtzQNpM3-fx)2D{rT1~5oKywEEYG_n{3yQVKCn8m)-QVFCs<2y_Ihs6}lBZ zx`F9(>KexEO0V@N-FG5q9X$B{$wcotv7#kj_|)iRYbiWi<)VDK6#Ou_EvU|ww!}^R z_uSmv?z7B8?_71ATwIL$FS_r=;qkJb2}eUhtI&0>YWq=ndezmdb|W&`w#E@8*SI@| zVY$}4&FQgkSMY3md%LLqP)A>OPLAFNg0-uhIC!Hwy6?i1(6F%mMI@`~Pfr)`>4^h- z9x@!C;Zv0cuJVI|%|T~f>3X zB3G3nl16A~D5b`?^aED@GQ_g-7*`km+AljhJLTCm&#eQKlaou?w9i%kwhvcUR*IBL z<;U2jPn3(4-dC8 zJT>#X8_FSZvjCmj{hF+%rk0DgZvSX|nsST=udY*=sb4^99dRPUoV+~lao&>?MPy^It2k&x`vRuaia8>yTt=M9NAT_L&k^P-lnAP{Qi4x5mzDp^{KUa&%nWvE;i@3m;itEG=#7o%ld92p}R(aGF~k@pyLF*{1T2O;&Jv zgrND}YDl8=(dyrrno9cMOJUy@wPP?CeB(%5U&Al)d!2h50=Jhue*EjN(?6K>^}y-*;H!l{ z6q~n;gr7vSOBZSIN2iQX#RaCGDRDC0JInpUH+9%-_KCgc?5B#WtvWtle&VE4C6qL0 z{P9i-?c*GV-UlW7tP3$@?!#m%zT|PkKI{Et5#?=dOr8b5?Ph#1m1;-5odk8A=m42L zU0J{?9&b?^>FeuDv}D_1>VCve4Yjqs`Q5LVPY~|^TvE~tU9C5%Gows|C>KOYPnQXy z3pC$2GTkvR@2{nZhcdtd>&8jK@5{djQf`ICg?6&#V#TnVH zB1KF1>_}sGV>~_^?Hx9?`I#0Po?Q;77bHBteccg@9r;C=VQ103upE~E`g0tI(*WL7 zi{t!m?C;s?4|Sy5mT=|l>@{N?&$eivbqPp7BdmN7=8Hz3B%8j6T{g{n@1|$my}p`N zr}KJNu>P@9I8u6-d;F^!x)zQq9Y7x)yz!UHn$X zD@mQr?GuB?{7ElAt6a&r$5z*iElD@Y!1~MfR&7n|r>}lKsZu?JNViqI^Fm^}$`_3n Xzb!uLt{pR7{k7V&%a>S3h&c8aEyHwq literal 0 HcmV?d00001 diff --git a/resource/images/ico_switch_on.png b/resource/images/ico_switch_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e2f19be35a6c72f5bb0dd21fa545c7f25aec174d GIT binary patch literal 2098 zcmY*adpMM78-K^Sk&?)k%H)uuF^14+#$g->gQ&&2N@EUAY%h+d3^GIY-(U)>(3v+Sh(v`+eUZ_j4bf`}y7X^Ly^=dXk+StYzQ_-~a%~5Ns@* zA#DT6F)0aXJ-@&95TsyCXKOt0==H%#$Px24Bbos~`8DY;Byq^!5oF`e1b}_&+X5pv zt1UnW5`E9QvD}FEM&!T%Z4xEWi>e(S5Cmld0M;Zth(z|MvJhTWZ(k6nF<(=sf$*i^ zG+gzGI>aDzs*kS?n?ZG9JDer6{mB@LhKaEZ92;%~Ap}raBt&=s9b_7X<5d0uHiGQ! zFiOQ3%b?JVoGq-rXFwiK#fQZTGD4xk!osw}^t1yR-Y7H%gF)%&qI7kUPzI720kTNp zNRX-e9l(OhBr|-2SiXTEVjGa;6&S+8sf2|1QjBOMn!Xo>qL1_<=~0kqG=+pDQS{JA zik=?DP#=9tmxlII`CgvoOZ#tqkolbkh!E8F4hpTUv)%HxZRE)Cr9xe7mo!FW|Jnb) z7#6kN$p18E{GSMPSIGL8nQfZ>WtR#KrIJB$uUGQFt_^?CEXJ@pZEu4*t!lD+%xJYqSIlxhC}$4YE2G_hqHBE0#iz z@H5ub&VfT&v8MJH)MV71TDjzhAzk?HUP7?uI?E(9jFvBO8@9}8=Fd#6i1bVdqj)cB zwuWZrX4-(RI*-6lRHWr??<^w~aubzK-^Hq(0#7Mm=d0A$)EMW+{CyPK}4 z{pCZq=kVY%qlvSj!HbB&9TZvfc`$i1gGU)TLL_wPfJh{iyV+LJ4aL`e~9F!Vxb9N5rU#zD?5K<7YE8 zMzK1+s9+=8uWKXA(k~TZ8SNU~%QVl34l`jQd)0k9x)(Y=Bu`L#=M8$KO3OUB2UPBu z+SYd$`Cnv9UtP`Cd6hYS>Eu2b0#DQ0F?Ylu(sW5GDgOp0S`tW?*ID*~m2U~#OxOG7 zCTfP9J714r6)0?eUFmZU$tCsW_3HLL0UX$(n8oY3vWBewg~xZDA3G{zUwp`X)bO6E zI&3wq%q`%h-tKD}#IMP*k00>tO!J&cu=xY! zvo|~vE5(-6b{{%7Jixs$^W=7|q)X~IFU>bDiut(Bz^bumVI0rly!7-+B>&OlCw!;j zTQ3El3h#i!C3f_Vhl%V{sak55`Q)d%whGQ72zd43=*ZCUk43qGY7L7QO{hIQo0j@3 z&uv4nCz)$)QF@*|ai!kZ9^yOCU;qTu_|(;=L8N4hF!Z`P&MH4fQ!HY7U{vdKW`TfN zyxFo>^&Z=Gcan@bMV?iRuG$j3-wXC?^GEt3@vgsN4EBvBU*FElb+?nX{FpQa|26NR zm`F=_VnxKK*)8&5`(VSn&8CXZaZAAIyjiA7@ZDSL9Bx%BSH@+N=#S5j7woxgTW%<% z&0g^ev~~T>G0Ria?g!$K6wtrCS(vBhqiCJ?Vl~MWR$z$wI#yYdTbVm{dXgv$#jiWByYa3effQw>kWVF-3#fP*yb%bv_5p9M~h#nZ|^;IK;JpG?@CX>bOrOTN22x=dVj=h&}Z^KOB!ZR_ey!3e)!IQI}L8(A*7M)du< zqsM)gp1J$^EH&4=Tm&%$w(OfkUdQt=DOx&;B(5-gOkXO}0`ao(s6!5C=YUDBABDhL zJHsor!j2pKk|2IK0g>%TsgzgjlxMA5kGc*lQWuLO?Mu`i8$}g-yXn0M_JZ8`G0}?> zCp-nZTT|zvE+@zC$hN<-krzi6tyF)O^&-5!eNZOy6ZD{~+Pkwg&=RRPuSKlP9)BU< zO9)wM=_nW1S|8dwVePV6m4C{lq?FqMi@5-wo_W{1vm?OI-O6{rLh`(BdeKUs99gR$HJ&x>@`BeX2cDMEt!^IktbE zrbL94W9$K8KQt{RNe$9kpU-hH zvvW2@ojgjj6CSAo+fOr!$Ccltrmdb0YfS5k1DLAu%@L99{I+$kh#;N^qe{LtZj%zW zklC!=TD?c`_SuTNe@=+H{|bVxjjMY006_;Y0HDVGmhqLWkSEo#etC58WsT@pWrJXl bq4ZVS0FCwQr?-l3f7}F12a8Aei=4j!4R5$` literal 0 HcmV?d00001 diff --git a/ui/dpConfigurationDialog.ui b/ui/dpConfigurationDialog.ui index 268906e..9b3fc11 100644 --- a/ui/dpConfigurationDialog.ui +++ b/ui/dpConfigurationDialog.ui @@ -44,6 +44,26 @@ font: 12pt "黑体"; color: rgb(250, 250, 250); } +QRadioButton +{ +spacing:8px; +font: 12pt "黑体"; +color: rgb(250, 250, 250); +} +QRadioButton::indicator +{ +width:36px; +height:20px; +} +QRadioButton::indicator:unchecked +{ +image: url(:/images/ico_switch_off.png); +} +QRadioButton::indicator:checked +{ +image: url(:/images/ico_switch_on.png); +} + QLineEdit { font: 12pt "黑体"; @@ -730,6 +750,19 @@ background-color:transparent; Y轴排列: + + + + 0 + 100 + 121 + 31 + + + + 显示图例 + +