Qt

Ang graph ng pag-update ng real-time na QChart na dalawahang Y-axis

Qchart Dual Y Axis Real Time Update Graph



Ang graph ng pag-update ng real-time na QChart na dalawahang Y-axis

Paunang salita

Kailangan ng trabaho na gawin ang isang dobleng tsart ng linya ng Y-axis, bilang karagdagan sa pagtingin sa dokumentasyon ng klase na nauugnay sa QT, walang nahanap na maraming impormasyon, kaya itala ito.

handa na

Una sa lahat, sa pamamagitan ng dokumentasyon ng tulong ng QT upang maunawaan ang paglalarawan ng QChart, QSplineSeries (o iba pang Series), QValueAxis at iba pang mga klase, ang pagsasalin ay isang uri ng online na pagsasalin, at pagkatapos ay bahagyang mabago ang hindi komportable na lugar.
QChart
Pinangangasiwaan ng klase ng QChart ang grapikong representasyon ng serye ng mga tsart, alamat, at palakol.
Pinangangasiwaan ng klase ng QChart ang grapikong representasyon ng mga linya, alamat, at palakol sa isang tsart.
Ang QChart ay isang QGraphicsWidget na maaari mong ipakita sa isang QGraphicsScene. Pinamamahalaan nito ang grapikong representasyon ng iba't ibang uri ng serye at iba pang mga bagay na nauugnay sa tsart tulad ng alamat at palakol. Upang maipakita lamang ang isang tsart sa isang layout, maaaring magamit ang klase ng kaginhawaan na QChartView sa halip na QChart. Bilang karagdagan, ang serye ng linya, spline, lugar, at kalat ay maaaring ipakita bilang mga chart ng polar sa pamamagitan ng paggamit ng klase ng QPolarChart.
Ang QChart ay isang QGraphicsWidget na maaaring ipakita sa QGraphicsScene. Namamahala ito ng mga grapikong representasyon ng iba't ibang uri ng serye at iba pang mga kaugnay na bagay sa tsart (larawan at palakol). Upang maipakita lamang ang tsart sa layout, maaari mong gamitin ang klase ng kaginhawaan na QChartView sa halip na QChart. Bilang karagdagan, ang mga tuwid na linya, makinis na kurba, mga lugar, at mga kalat na kalat ay maaaring kinatawan bilang mga polar plot ng klase ng QPolarChart.
QSplineSeries
Ang klase ng QSplineSeries ay nagpapakita ng data bilang mga chart ng spline.
Ang klase ng QSplineSeries ay kumakatawan sa data bilang isang maayos na grap.
Ang isang serye ng spline ay nag-iimbak ng mga puntos ng data at mga puntos ng kontrol sa segment na kinakailangan ng QPainterPath upang gumuhit ng isang spline. Ang mga control point ay awtomatikong kinakalkula kapag nagbago ang data. Kinukuwenta ng algorithm ang mga puntos upang maiguhit ang normal na spline.
Ang isang serye ng spline ay nag-iimbak ng mga puntos ng data at mga puntos ng kontrol sa segment na kinakailangan ng QPainterPath upang gumuhit ng isang makinis na curve. Kapag nagbago ang data, ang control point ay awtomatikong kinakalkula. Kinakalkula ng algorithm ang mga puntos upang gumuhit ng isang makinis na curve.
QValueAxis
Ang klase ng QValueAxis ay nagdaragdag ng mga halaga sa mga axes ng isang tsart.
Ang klase ng QValueAxis ay nagdaragdag ng mga halaga sa axis ng tsart.
Ang isang halaga ng axis ay maaaring i-set up upang maipakita ang isang linya ng axis na may mga marka ng tick, linya ng grid, at shade. Ang mga halaga sa axis ay iginuhit sa mga posisyon ng mga tick mark.
Maaari kang magtakda ng isang halaga ng axis upang ipakita ang axis na may mga marker, linya ng grid, at mga anino. Ang halaga sa axis ay iginuhit sa minarkahang posisyon.
QDateTimeAxis
Ang klase ng QDateTimeAxis ay nagdaragdag ng mga petsa at oras sa axis ng isang tsart.
Ang klase ng QDateTimeAxis ay nagdaragdag ng petsa at oras sa axis ng tsart.
Maaaring i-set up ang QDateTimeAxis upang maipakita ang isang linya ng axis na may mga marka ng tick, linya ng grid, at shade. Maaaring mai-configure ang mga label sa pamamagitan ng pagtatakda ng isang naaangkop na format ng DateTime. Ang QDateTimeAxis ay gumagana nang tama sa mga petsa mula 4714 BCE hanggang 287396 CE. Para sa iba pang mga limitasyon na nauugnay sa QDateTime, tingnan ang dokumentasyon ng QDateTime.
Maaari mong itakda ang QDateTimeAxis upang ipakita ang mga palakol na may mga marker marker, linya ng grid, at mga anino. Ang halagang ipinapakita sa axis ay maaaring mai-configure sa pamamagitan ng pagtatakda ng naaangkop na format ng DateTime. Ang QDateTimeAxis ay maaaring kumatawan sa oras sa pagitan ng 4714 BC at 287396 AD. Para sa iba pang impormasyon na nauugnay sa QDateTime, mangyaring sumangguni sa dokumentasyon ng QDateTime.
Tandaan : Ang QDateTimeAxis ay hindi pinagana sa mga platform na tumutukoy sa qreal bilang float.
tandaan : Huwag paganahin ang QDateTimeAxis sa mga platform kung saan ang qreal ay tinukoy bilang isang float.
Ang mas mahalagang pagpapaandar para sa pagtatakda ng dobleng Y axis ay ang QChart. addSeries , addAxis Ang dalawang pag-andar, ang nauna ay upang magdagdag ng isang linya sa QChart, ang huli ay idagdag ang axis sa tinukoy na posisyon. at saka QSplineSeries ng ikabitAxis pagpapaandar Ang paglalarawan sa dokumento ng QT ay ang mga sumusunod:
walang bisa QChart :: addSeries (QAbstractSeries * serye)
Nagdaragdag ng serye ng serye sa tsart at kinukuha ang pagmamay-ari nito.
Idagdag ang serye sa tsart, at nakukuha ng tsart ang pagmamay-ari ng serye, ibig sabihin ang tsart ay magiging magulang ng serye.
Tandaan : Ang isang bagong idinagdag na serye ay hindi naka-attach sa anumang mga palakol bilang default, hindi kahit na ang mga maaaring nilikha para sa tsart gamit ang createDefaultAxes () bago idagdag ang serye sa tsart. Kung walang mga palakol na nakakabit sa bagong idinagdag na serye bago ipakita ang tsart, iguhit ang serye na parang mayroon itong mga palakol na may mga saklaw na eksaktong akma sa serye sa lugar ng plot ng tsart. Ito ay maaaring nakalilito kung ang parehong tsart ay nagpapakita rin ng iba pang mga serye na may maayos na nakakabit na mga palakol, kaya laging siguraduhin na tumawag ka sa createDefaultAxes () pagkatapos na maidagdag ang isang serye o malinaw na nakakabit ng mga palakol para sa serye.
tandaan : Bilang default, ang bagong idinagdag na serye ay hindi mai-kalakip sa anumang axis, kahit na ang nilikha ng pag-andar ng createDefaultAxes () ng tsart bago idagdag ang serye sa tsart. Kung walang mga palakol na nakakabit sa bagong idinagdag na serye bago ipakita ang tsart, iginuhit ang pagkakasunud-sunod na parang ang axis nito ay saklaw nang eksakto tulad ng serye na tumutugma sa lugar ng pagguhit ng tsart. Kung nagpapakita rin ang parehong tsart ng iba pang mga serye ng mga palakol na nakakabit, maaari itong gumuhit ng isang nakalilito na larawan, kaya tiyaking tumawag sa createDefaultAxes () pagkatapos idagdag ang serye, o malinaw na idagdag ang axis sa serye.
* void QChart :: addAxis (QAbstractAxis * axis, Qt :: Pagkahanay ng pagkakahanay)
Idinaragdag ang axis axis sa tsart na nakahanay bilang tinukoy ng pagkakahanay. Kinukuha ng tsart ang pagmamay-ari ng axis.
Idagdag ang mga palakol sa mga tinukoy na posisyon sa tsart (kaliwa, ibaba, kanan, itaas). Nakukuha ng tsart na ito ang pagmamay-ari ng axis.
bool QAbstractSeries :: attachAxis (QAbstractAxis * aksis)
Ikinakabit ang axis na tinukoy ng axis sa serye.
Idagdag ang tinukoy na axis sa serye.
Ibinabalik totoo kung ang axis ay matagumpay na na-attach, maling kung hindi man.
Ibalik ang totoo kung matagumpay, kung hindi man ay bumalik nang hindi totoo
Tandaan : Kung maraming mga palakol ng parehong oryentasyon ay nakakabit sa parehong serye, magkakaroon sila ng parehong minimum at maximum na mga halaga.
tandaan : Kung maraming mga palakol sa parehong direksyon sa parehong serye, ang kanilang minimum at maximum na mga halaga ay pareho.



Pagpapatupad ng code

Susunod, simulan ang pagsulat ng code, buksan ang QT, ang sa akin ay QT5.11, lumikha ng isang bagong proyekto, idagdag sa .pro file.



QT+=charts

Idagdag ang file ng header ng QChart sa pinagmulang file



#include #include

Magdagdag ng isang namespace sa .cpp file

QT_CHARTS_USE_NAMESPACE //or using namespace QtCharts

Pagkatapos magdagdag ng isang Pagtingin sa Grapiko sa bintana sa taga-disenyo ng QT at itaguyod ito sa QChartView.
imahe
Pagkatapos i-edit ang pinagmulang file, narito ako nang direkta sa code, ang code ay nakasulat na may mga komento.
mainwindow.h

#ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include #include namespace Ui { class MainWindow } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0) ~MainWindow() /*menbers**************************************************************************************/ / / Declare an instance of QChart, an instance of QSplineSeries QChart *chart QSplineSeries *series1 QSplineSeries *series2 / / Declare timer QTimer *timer /*funcions **************************************************************************************/ //Declare the function of the line and the function that initializes QChart void drawLine() void initChart() public slots: /*slot function**********************************************************************************/ / / Declare the timer slot function void timerDeal() private: Ui::MainWindow *ui } #endif // MAINWINDOW_H

mainwindow.cpp

#include 'mainwindow.h' #include 'ui_mainwindow.h' #include #include QT_CHARTS_USE_NAMESPACE MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this) / / Initialize QChart initChart() / / Set the timer, the slot is connected to timer = new QTimer() timer->setInterval(400) connect(timer,SIGNAL(timeout()),this,SLOT(timerDeal())) timer->start() } MainWindow::~MainWindow() { delete ui } / / Realize the initialization function of QChart void MainWindow::initChart() { / / Initialize the instance of QChart chart = new QChart() / / Initialize two instances of QSplineSeries series1 = new QSplineSeries() series2 = new QSplineSeries() / / Set the name of the two curves series1->setName('series1') series2->setName('series2') / / Add the curve to the QChart instance chart chart->addSeries(series1) chart->addSeries(series2) / / Declare and initialize the X axis, two Y axis QDateTimeAxis *axisX = new QDateTimeAxis() // QValueAxis *axisX = new QValueAxis() QValueAxis *axisY_1 = new QValueAxis() QValueAxis *axisY_2 = new QValueAxis() / / Set the range of the axis display axisX->setMin(QDateTime::currentDateTime().addSecs(-60 * 1)) axisX->setMax(QDateTime::currentDateTime().addSecs(0)) axisY_1->setMin(0) axisY_1->setMax(18) axisY_2->setMin(0) axisY_2->setMax(18) / / Set the grid points on the axis axisY_1->setTickCount(7) axisY_2->setTickCount(11) / / Set the name of the axis display axisX->setTitleText('X axis') axisY_1->setTitleText('axisY_1-series1') axisY_2->setTitleText('axisY_2-series2') / / Set the color of the axis, thickness, set the grid does not display axisY_1->setLinePenColor(QColor(Qt::darkBlue)) axisY_1->setGridLineColor(QColor(Qt::darkBlue)) axisY_2->setLinePenColor(QColor(Qt::darkGreen)) axisY_2->setGridLineColor(QColor(Qt::darkGreen)) axisY_1->setGridLineVisible(false) axisY_2->setGridLineVisible(false) QPen penY1(Qt::darkBlue, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin) QPen penY2(Qt::darkGreen, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin) axisY_1->setLinePen(penY1) axisY_2->setLinePen(penY2) / / Add the axis to the chart, // The second parameter of the addAxis function is to set the position of the axis. // There are only four options, below: Qt::AlignBottom, left: Qt::AlignLeft, right: Qt::AlignRight, top: Qt::AlignTop chart->addAxis(axisX, Qt::AlignBottom) chart->addAxis(axisY_1, Qt::AlignLeft) chart->addAxis(axisY_2, Qt::AlignRight) / / Associate the curve to the axis series1->attachAxis(axisX) series1->attachAxis(axisY_1) series2->attachAxis(axisX) series2->attachAxis(axisY_2) / / Display the chart to the window ui->graphicsView->setChart(chart) } / / Realize the line function, dynamic update void MainWindow::drawLine() { / / Each additional point changes the range of the X axis to achieve the dynamic update effect of the curve QDateTime bjtime = QDateTime::currentDateTime() qsrand(QTime(0,0,0).secsTo(QTime::currentTime())) chart->axisX()->setMin(QDateTime::currentDateTime().addSecs(-60 * 1)) chart->axisX()->setMax(QDateTime::currentDateTime().addSecs(0)) //When the earliest point on the curve exceeds the range of the X axis, the oldest point is removed. if(series1->count() > 119) { series1->removePoints(0,series1->count() - 119) } if(series2->count() > 119) { series2->removePoints(0,series2->count() - 119) } Int Y1 = qrand()%9 // randomly generate random numbers from 0 to 9 Int Y2 = 9 + qrand()%9// randomly generate 9 to 18 random numbers //Add a new point to the end of the curve series1->append(bjtime.toMSecsSinceEpoch(), Y1) series2->append(bjtime.toMSecsSinceEpoch(), Y2) } / / Implement the timer slot function void MainWindow::timerDeal() { / / Timing curve drawLine() }

Ang pangwakas na epekto, ang curve at ang saklaw ng X-axis ay na-update sa real time sa paglipas ng panahon.
imahe
imahe

sa kabuuan

Matapos maunawaan ito, nararamdaman kong hindi mahirap makamit ang epektong ito. Ang mga pangunahing pagpapaandar ay ilan lamang. Bagaman hindi ito mahirap, malulutas ito bilang isang problema at nagkamit ng paglago.

pahayag

Ang code sa artikulong ito ay isinulat ko, ang artikulong ito ay aking orihinal din, mangyaring ipahiwatig ang mapagkukunan.