使用Qt的QChartView實(shí)現(xiàn)縮放和放大功能
Qt的常用圖表方式Qwt、QChart、QCustomPlot等。QCharts是官方的,功能強(qiáng)大些。QCustomPlot是一個(gè)小型的Qt畫圖標(biāo)類,支持繪制靜態(tài)曲線、動(dòng)態(tài)曲線、多重坐標(biāo)曲線,柱狀圖,蠟燭圖等。QCustomPlot比Qchat簡(jiǎn)單好用些。
這里介紹下QChartView縮放和放大功能的實(shí)現(xiàn)。
這里介紹下QChartView縮放和放大功能的實(shí)現(xiàn)。
QChartView開啟鼠標(biāo)拖動(dòng)放大功能:
ui->wdChart->setRubberBand(QChartView::RectangleRubberBand);
開啟后,拖動(dòng)鼠標(biāo)區(qū)域自動(dòng)放大,鼠標(biāo)右鍵點(diǎn)擊自動(dòng)縮小。
恢復(fù)的話重新設(shè)置下軸的最大最小范圍setRange即可。這里介紹下鼠標(biāo)左鍵單擊實(shí)現(xiàn)恢復(fù)的辦法:
自定以一個(gè)MyChartView,繼承自QChartView。增加一個(gè)信號(hào):
signals: void sgl_recoverRange(MyChartView *p);
需要在自定義的MyChartView中區(qū)分出來是否是鼠標(biāo)左鍵的單擊事件還是鼠標(biāo)左鍵的拖動(dòng)。這里巧妙實(shí)現(xiàn)了下。原理很簡(jiǎn)單,如果是鼠標(biāo)拖動(dòng)的話mouseMoveEvent中把is_Pressed_清掉。
#include "mychartview.h" MyChartView::MyChartView(QWidget *parent):QChartView(parent) { is_Pressed_ = false; } void MyChartView::mouseMoveEvent(QMouseEvent *event) { is_Pressed_ = false; QChartView::mouseMoveEvent(event); } void MyChartView::mouseReleaseEvent(QMouseEvent *event) { if(event->button() == Qt::LeftButton){ if(is_Pressed_){ is_Pressed_ = false; // 單擊鼠標(biāo)恢復(fù)縮放 emit sgl_recoverRange(this); } } QChartView::mouseReleaseEvent(event); } void MyChartView::mousePressEvent(QMouseEvent *event) { is_Pressed_ = true; QChartView::mousePressEvent(event); }
綁定信號(hào)和槽函數(shù):
connect(ui->wdChart,&MyChartView::sgl_recoverRange, this,&MainWindow::slot_recoverChartRange); m_tooltip = new Callout(myChart);
在槽函數(shù)中對(duì)縮放和放大功能進(jìn)行恢復(fù)處理,重新設(shè)置range.
void MainWindow::slot_recoverChartRange() { qDebug() << "slot_recoverChartRange"; int maxVal = 0; if(mTbData.recList.size() == 0){ mAxisY->setRange(0,12); mAxisY1->setRange(0,12); mAxisX->setRange(0,10); return; } }
更好用的QCustomPlot
QCustomPlot介紹
QCustomPlot 是一個(gè)基于Qt的畫圖和數(shù)據(jù)可視化C++控件。QCustomPlot 致力于提供美觀的界面,高質(zhì)量的2D畫圖、圖畫和圖表,同時(shí)為實(shí)時(shí)數(shù)據(jù)可視化應(yīng)用提供良好的解決方案。 該繪圖庫(kù)專注于制作美觀、出版物質(zhì)量高的2D繪圖、圖形和圖表,并為實(shí)時(shí)可視化應(yīng)用程序提供高性能。
QCustomPlot的下載與安裝
QCustomPlot官網(wǎng)鏈接:Qt Plotting Widget QCustomPlot - Introduction
下載鏈接:Qt Plotting Widget QCustomPlot - Download
QCustomPlot的使用
QCustomPlot 是一個(gè)超強(qiáng)超小巧的qt繪圖類,非常漂亮,非常易用。只需要把下載下來的qcustomplot.h和qcustomplot.cpp文件加入項(xiàng)目工程即可使用,遠(yuǎn)比qwt方便和漂亮,可以自己使用兩個(gè)源文件也可以自己編譯成庫(kù)文件,非常方便。
把qcustomplot.cpp和qcustomplot.h拷貝到工程目錄下,在項(xiàng)目中點(diǎn)右鍵添加現(xiàn)有文件,把兩個(gè)文件加入工程。
這時(shí)pro文件會(huì)添加上qcustomplot.cpp和qcustomplot.h,如果Qt版本在5.0以上,需要在.pro文件中的QT變量加上printsupport,QT += printsupport。
界面上拖上去一個(gè)widget控件,然后使一個(gè)widget提升為QCustomPlot類,即可使用。
使用示例
void OneGraph::OneGraph_Drawing(QCustomPlot *customPlot) { // 將數(shù)據(jù)用曲線實(shí)時(shí)顯示 QVector<double> x(101),y(101);// x軸數(shù)據(jù),y軸數(shù)據(jù) for(int i = 0; i < 101;i++) { x[i] = i / 50.0 - 1;// x軸數(shù)據(jù)范圍:-1 ~ 1 y[i] = x[i] * x[i];// y軸數(shù)據(jù)范圍:0 ~ 1 } // 添加一個(gè)曲線圖QGraph, customPlot->addGraph(); customPlot->graph(0)->setData(x,y);//為坐標(biāo)軸添加數(shù)據(jù) customPlot->graph(0)->setName("示例1:繪制一個(gè)曲線");// 設(shè)置曲線圖的名字 // 如果需要添加多個(gè)曲線,就需要多次調(diào)用addGraph()函數(shù) // customPlot->addGraph(); // customPlot->graph(1)->setData("x軸數(shù)據(jù)","y軸數(shù)據(jù)"); // customPlot->graph(1)->setName("示例1:繪制第二個(gè)一個(gè)曲線"); // 設(shè)置圖表標(biāo)題 QCPTextElement *title = new QCPTextElement(customPlot,"標(biāo)題:繪制一個(gè)曲線",QFont("sans",10,QFont::Bold)); title->setTextColor(Qt::green); title->setMargins(QMargins(0,6,0,10)); // 在第一行第一列添加標(biāo)題 customPlot->plotLayout()->insertRow(0);// 插入一行 customPlot->plotLayout()->addElement(0, 0, title); //為圖例添加標(biāo)題 QCPTextElement *legend_title = new QCPTextElement(customPlot,"這是圖例的標(biāo)題",QFont("sans",10,QFont::Bold)); legend_title->setTextColor(Qt::red); legend_title->setMargins(QMargins(0,6,0,10));// 為了效果更好,添加一些邊距 legend_title->setLayer("legend");// 一定要把標(biāo)題的層設(shè)置為legend層 customPlot->legend->insertRow(0);// 插入一行 customPlot->legend->addElement(0,0,legend_title);// 在第一行第一列添加標(biāo)題 // x軸設(shè)置屬性 customPlot->xAxis->setLabel("x軸數(shù)據(jù)");// 設(shè)置x軸的標(biāo)簽 customPlot->xAxis->setRange(-1,1);// 設(shè)置x軸的范圍為(-1,1) customPlot->xAxis->setPadding(30);//設(shè)置外邊距,數(shù)值可以改大或者改小來觀察效果 customPlot->xAxis->setLabelPadding(20);//設(shè)置標(biāo)簽內(nèi)邊距 customPlot->xAxis->setTickLabelPadding(10); // y軸設(shè)置屬性 customPlot->yAxis->setLabel("y軸數(shù)據(jù)"); customPlot->yAxis->setRange(-1,1); customPlot->yAxis->setPadding(10); //設(shè)置QCustomPlot的背景顏色 QLinearGradient plotGradient; plotGradient.setStart(0,0);//背景顏色起始點(diǎn),從圖左上角開始,y方向0~400之間為紅色漸變,開始位置為紅色 plotGradient.setFinalStop(0,400);//y方向 >400 為綠色漸變,結(jié)束位置為綠色 plotGradient.setColorAt(0,QColor(200,200,200));//黑色,透明度從 0 ~ 1, plotGradient.setColorAt(1,QColor(120,120,120)); customPlot->setBackground(plotGradient); //設(shè)置QCPAxisRect軸矩形的背景顏色 QLinearGradient axisRectGradient; axisRectGradient.setStart(0,0); axisRectGradient.setFinalStop(0,350); axisRectGradient.setColorAt(0,QColor("#87CEFA"));//亮天藍(lán)色 axisRectGradient.setColorAt(1,QColor("#FFB6C1"));//淺粉紅 customPlot->axisRect()->setBackground(axisRectGradient); //設(shè)置QCPAxis軸的風(fēng)格 customPlot->xAxis->setBasePen(QPen(Qt::white,2));// x軸線的畫筆顏色和粗細(xì) customPlot->xAxis->setTickPen(QPen(Qt::white,3));// x軸線上的主刻度線(有數(shù)字的刻度線)的畫筆顏色和粗細(xì) customPlot->xAxis->setTickLabelColor(Qt::green);// x軸線上的主刻度線下的文字顏色 customPlot->xAxis->setTickLengthIn(6);// 軸線內(nèi)主刻度線的長(zhǎng)度 customPlot->xAxis->setTickLengthOut(15);// 軸線外主刻度線的長(zhǎng)度 customPlot->xAxis->setSubTickPen(QPen(QColor(220,20,60),1));//粉紅色,x軸線上的子刻度線(有數(shù)字的刻度線)的畫筆顏色和粗細(xì) customPlot->xAxis->setLabelColor(Qt::red);// 只有設(shè)置了標(biāo)簽,軸標(biāo)簽的顏色才會(huì)顯示 customPlot->xAxis->setUpperEnding(QCPLineEnding::esSpikeArrow);// 設(shè)置軸線結(jié)束時(shí)的風(fēng)格為 實(shí)角三角形但內(nèi)部有凹陷的形狀 customPlot->xAxis->setLowerEnding(QCPLineEnding::esDisc);//setLowerEnding設(shè)置軸線開始時(shí)的風(fēng)格 //設(shè)置QCPGrid網(wǎng)格的風(fēng)格,每條網(wǎng)格對(duì)應(yīng)一個(gè)刻度 customPlot->xAxis->grid()->setPen(QPen(QColor(255,0,255),1,Qt::SolidLine));//實(shí)線 customPlot->yAxis->grid()->setPen(QPen(QColor(255,0,255),2,Qt::DotLine));//點(diǎn)線 customPlot->xAxis->grid()->setSubGridPen(QPen(QColor(80, 80, 80), 1, Qt::DotLine)); // 子網(wǎng)格線(對(duì)應(yīng)子刻度)畫筆 customPlot->yAxis->grid()->setSubGridPen(QPen(QColor(80, 80, 80), 1, Qt::SolidLine));//設(shè)置顏色后,需要顯示子網(wǎng)格線,才能看到效果 customPlot->xAxis->grid()->setSubGridVisible(true);// 顯示子網(wǎng)格線 customPlot->yAxis->grid()->setSubGridVisible(true); customPlot->xAxis->grid()->setZeroLinePen(QPen(Qt::black,3));// 設(shè)置刻度為0時(shí)的網(wǎng)格線的畫筆 customPlot->yAxis->grid()->setZeroLinePen(QPen(Qt::black,3)); customPlot->legend->setVisible(true);// 顯示圖例:曲線顏色和曲線名,一般在右上角,可以設(shè)置 // customPlot->replot();重繪 }
到此這篇關(guān)于使用Qt的QChartView實(shí)現(xiàn)縮放和放大功能的文章就介紹到這了,更多相關(guān)Qt QChartView縮放和放大內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言數(shù)據(jù)結(jié)構(gòu)之二叉樹詳解
二叉樹(Binary tree)是樹形結(jié)構(gòu)的一個(gè)重要類型。許多實(shí)際問題抽象出來的數(shù)據(jù)結(jié)構(gòu)往往是二叉樹形式。本文將通過示例詳細(xì)講解一下二叉樹,需要的可以參考一下2022-03-03C++構(gòu)造函數(shù)深度學(xué)習(xí)
這篇文章主要為大家詳細(xì)介紹了C++構(gòu)造函數(shù),深度學(xué)習(xí)C++構(gòu)造函數(shù),感興趣的小伙伴們可以參考一下2016-08-08C++實(shí)現(xiàn)日期計(jì)算器詳細(xì)代碼示例
這篇文章主要給大家介紹了關(guān)于C++實(shí)現(xiàn)日期計(jì)算器的相關(guān)資料,基于C++編寫的簡(jiǎn)單的日期計(jì)算器,供大家參考,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03C++11標(biāo)準(zhǔn)庫(kù)bind函數(shù)應(yīng)用教程
bind函數(shù)定義在頭文件functional中,可以將bind函數(shù)看做成一個(gè)通用的函數(shù)適配器,他接收一個(gè)可調(diào)用對(duì)象,生成一個(gè)新的可調(diào)用對(duì)象來"適應(yīng)"原對(duì)象的參數(shù)列表。本文將帶大家詳細(xì)了解一下bind函數(shù)的應(yīng)用詳解2021-12-12