欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Qt的QChartView實(shí)現(xiàn)縮放和放大功能

 更新時(shí)間:2022年09月19日 15:45:48   作者:特立獨(dú)行的貓a  
QCustomPlot是一個(gè)小型的Qt畫圖標(biāo)類,支持繪制靜態(tài)曲線、動(dòng)態(tài)曲線、多重坐標(biāo)曲線,柱狀圖,蠟燭圖,這篇文章主要介紹了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/C++中提高查找速度的小技巧

    C/C++中提高查找速度的小技巧

    這篇文章主要給大家介紹了C/C++中提高數(shù)組中查找某個(gè)元素或者字符串中查找某個(gè)字符效率的小技巧,提高速度對(duì)我們?nèi)粘i_發(fā)來說還是很有用的,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • C語言數(shù)據(jù)結(jié)構(gòu)之二叉樹詳解

    C語言數(shù)據(jù)結(jié)構(gòu)之二叉樹詳解

    二叉樹(Binary tree)是樹形結(jié)構(gòu)的一個(gè)重要類型。許多實(shí)際問題抽象出來的數(shù)據(jù)結(jié)構(gòu)往往是二叉樹形式。本文將通過示例詳細(xì)講解一下二叉樹,需要的可以參考一下
    2022-03-03
  • Easyx實(shí)現(xiàn)掃雷游戲

    Easyx實(shí)現(xiàn)掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了Easyx實(shí)現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 深入理解C++的對(duì)象模型

    深入理解C++的對(duì)象模型

    本文在介紹C++使用的對(duì)象模型之前,先介紹了2種對(duì)象模型:簡(jiǎn)單對(duì)象模型(a simple object model)和表格驅(qū)動(dòng)對(duì)象模型(a table-driven object model),這樣介紹對(duì)后面的內(nèi)容更有幫助,有需要的小伙伴們可以參考學(xué)習(xí)。
    2016-08-08
  • C語言實(shí)現(xiàn)三子棋(井字棋)算法

    C語言實(shí)現(xiàn)三子棋(井字棋)算法

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)三子棋(井字棋)算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++構(gòu)造函數(shù)深度學(xué)習(xí)

    C++構(gòu)造函數(shù)深度學(xué)習(xí)

    這篇文章主要為大家詳細(xì)介紹了C++構(gòu)造函數(shù),深度學(xué)習(xí)C++構(gòu)造函數(shù),感興趣的小伙伴們可以參考一下
    2016-08-08
  • C++實(shí)現(xiàn)日期計(jì)算器詳細(xì)代碼示例

    C++實(shí)現(xiàn)日期計(jì)算器詳細(xì)代碼示例

    這篇文章主要給大家介紹了關(guān)于C++實(shí)現(xiàn)日期計(jì)算器的相關(guān)資料,基于C++編寫的簡(jiǎn)單的日期計(jì)算器,供大家參考,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • c++ stack容器適配器的使用

    c++ stack容器適配器的使用

    在C++中,std::stack是一個(gè)標(biāo)準(zhǔn)模板庫(kù)中的容器適配器,它提供了一種后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),本文主要介紹了c++ stack容器適配器的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • C語言實(shí)現(xiàn)圖的搜索算法示例

    C語言實(shí)現(xiàn)圖的搜索算法示例

    這篇文章主要介紹了C語言實(shí)現(xiàn)圖的搜索算法,結(jié)合具體實(shí)例形式分析了C語言實(shí)現(xiàn)圖的定義及搜索相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • C++11標(biāo)準(zhǔn)庫(kù)bind函數(shù)應(yīng)用教程

    C++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

最新評(píng)論