qt折線圖顯示資料

來源:互聯網
上載者:User

                     前面也寫了一個關於折線的,可是那個太...,暑假沒事在家又弄了一個,希望它能夠有一點可適應性和擴充性。

                    

                    下面是代碼實現

     

/*************************************************折線圖繪製author 周翔2012-8-14*************************************************/#ifndef LINEGRAPHWIDGET_H#define LINEGRAPHWIDGET_H#include <QWidget>#include <QPen>#include <QPainter>#include <QResizeEvent>//#include <QDebug>#include <QTimer>struct point{int x;int y;};class LineGraphWidget : public QWidget{Q_OBJECTpublic://mix和max為折線的y軸的資料範圍explicit LineGraphWidget(int mix, int max,QWidget *parent = 0);void setSingleUnitX(const int &value) {singleUnitX = value;}//設定x軸的一個單位佔多少個像素,預設10//支援定時器定時更新void startUpdataTimer(int msecond);void stopUpdataTimer();signals://支援即時更新void newDataCome();//有新資料到來時發出的折線圖更新訊號public slots:void showData(const int &data);//接受來之外部的資料protected:void paintEvent(QPaintEvent *);void resizeEvent(QResizeEvent *e);private:QList<int> xList;QList<int> yList;int Counter;//視窗的長和寬int widgetX;int widgetY;//折線圖的顯示範圍int rangeMin;int rangeMax;//根據視窗和範圍得出的單位長,x軸,y軸int singleUnitX;int singleUnitY;//根據視窗得出的多少個單位,x軸,y軸int sumUnitX;int sumUnitY;point basePoint;//折線圖的原點point xAxisEndPoint;//X軸的終點point yAxisEndPoint;//Y軸的終點QTimer *timer;void getSumUnitX();void getSingleUnitY();void initGraph();};#endif // LINEGRAPHWIDGET_H#include "linegraphwidget.h"LineGraphWidget::LineGraphWidget(int mix, int max, QWidget *parent) :QWidget(parent),rangeMin(mix),rangeMax(max),singleUnitX(10),timer(NULL){connect(this,SIGNAL(newDataCome()),this,SLOT(update()));}void LineGraphWidget::paintEvent(QPaintEvent *){int i;int a,b,c,d;Counter = 0;QPixmap pix(widgetX,widgetY);QPainter painter(&pix);pix.fill(Qt::white);QPen pen;pen.setBrush(Qt::darkGreen);painter.setPen(pen);QPen pen1;pen1.setBrush(Qt::black);painter.setRenderHint(QPainter::Antialiasing);for(i = 0;i < sumUnitX; ++i) {a = basePoint.x + i*singleUnitX;b = basePoint.y;c= a;d = yAxisEndPoint.y;painter.drawLine(a,b,c,d);}for(i = 0; i < sumUnitY+1; ++i) {a = basePoint.x;b = basePoint.y - singleUnitY*i;c = xAxisEndPoint.x;d = b;painter.drawLine(a,b,c,d);}painter.setPen(pen1);for (i = 0;i < (sumUnitY/2+1);++i) {QRectF rectF(0,basePoint.y - singleUnitY*i*2 - 5,basePoint.x,(widgetY - basePoint.y)/3);painter.drawText(rectF,Qt::AlignCenter,QString::number(rangeMin+i*20));}for (i = 0;i < sumUnitX/5;++i) {QRectF rectF(basePoint.x+singleUnitX*(5*i+3),basePoint.y,singleUnitX*4,widgetY-basePoint.y);painter.drawText(rectF,Qt::AlignCenter,QString::number(5*(i+1)*singleUnitX));}int size = xList.size();while(Counter < (size -1)) {painter.drawLine(basePoint.x + xList.value(Counter)*singleUnitX,basePoint.y - ((yList.value(Counter) - rangeMin)/10.0)*singleUnitY,basePoint.x + xList.value(Counter + 1)*singleUnitX,basePoint.y - ((yList.value(Counter + 1) - rangeMin)/10.0)*singleUnitY);Counter++;}painter.end();painter.begin(this);painter.drawPixmap(0,0,pix);painter.end();Counter = 0;}void LineGraphWidget::resizeEvent(QResizeEvent * e){if (e->oldSize() != size()) {initGraph();}}void LineGraphWidget::showData(const int &data){//這裡還要進行相關的資料正確性檢測,不能超過圖的範圍if (data > rangeMax || data < rangeMin) {return;}int xsize = xList.size();int yValue = data;if (xsize == sumUnitX) {xList.clear();yList.clear();xsize = xList.length();}if (xsize >= 1) {xList.insert(xsize,xsize);yList.insert(xsize,yValue);emit newDataCome();}else {xList.insert(xsize,xsize);yList.insert(xsize,yValue);}}void LineGraphWidget::getSumUnitX(){if ((static_cast<int>(widgetX*0.85))%singleUnitX == 0){sumUnitX = (static_cast<int>(widgetX*0.85))/singleUnitX;}else {sumUnitX = (static_cast<int>(widgetX*0.85))/singleUnitX + 1;}}void LineGraphWidget::getSingleUnitY(){int range = rangeMax - rangeMin;if (range == 0) {sumUnitY = range/10 + 1;}else {sumUnitY = range/10 + 2;}singleUnitY = (static_cast<int>(widgetY*0.85))/sumUnitY;}void LineGraphWidget::initGraph(){widgetX = size().width();widgetY = size().height();basePoint.x = static_cast<int>(widgetX*0.1);basePoint.y = static_cast<int>(widgetY*0.9);yAxisEndPoint.x = basePoint.x;yAxisEndPoint.y = static_cast<int>(widgetY*0.05);xAxisEndPoint.x = static_cast<int>(widgetX*0.95);xAxisEndPoint.y = basePoint.y;getSumUnitX();getSingleUnitY();}void LineGraphWidget::startUpdataTimer(int msecond){if (timer != NULL) {if (timer->isActive()) {timer->stop();}delete timer;}disconnect(SIGNAL(newDataCome()));timer = new QTimer;connect(timer,SIGNAL(timeout()),this,SLOT(update()));timer->start(msecond);}void LineGraphWidget::stopUpdataTimer(){if (timer == NULL) {}else {timer->stop();delete timer;}}

這篇部落格還是去年暑假寫的,下面幾位仁兄,糾結與main函數怎麼寫,我很是....,我認為這不是問題。

還是我把代碼注釋一下吧

/*************************************************  折線圖繪製  author 周翔  2012-8-14  對外提供介面   void showData(int data);接受外部的折線資料   void setSingleUnitX(const int &value);設定x軸的單位像素   void startUpdataTimer(int msecond);定時器更新折線圖   void stopUpdataTimer();關閉定時器  *************************************************/#ifndef LINEGRAPHWIDGET_H#define LINEGRAPHWIDGET_H#include <QWidget>#include <QPen>#include <QPainter>#include <QResizeEvent>//#include <QDebug>#include <QTimer>struct point{    int x;    int y;};class LineGraphWidget : public QWidget{    Q_OBJECTpublic:    //mix和max為折線的y軸的資料範圍    explicit LineGraphWidget(int min, int max, QWidget *parent = 0);    void setSingleUnitX(const int &value) {singleUnitX = value;}//設定x軸的一個單位佔多少個像素,預設10    //支援定時器定時更新    void startUpdataTimer(int msecond);    void stopUpdataTimer();signals:    //支援即時更新    void newDataCome();//有新資料到來時發出的折線圖更新訊號public slots:    /**     * @brief showData     * @param adress 地址     * @param _data 資料     */    void showData(const QString& adress,int _data);//接受來之外部的資料    /**     * @brief slt_showData 接受外部資料     * @param name 裝置名稱     * @param _data 資料     */    void slt_showData(ushort name,int _data);protected:    void paintEvent(QPaintEvent *);    void resizeEvent(QResizeEvent *e);private:    QString  m_currentNodeAdress;//當前顯示的節點的地址    ushort m_currentNodeName;//當前節點的裝置名稱    QList<int> xList;    QList<int> yList;    int Counter;    //視窗的長和寬    int widgetX;    int widgetY;    //折線圖的顯示範圍    int rangeMin;    int rangeMax;    //根據視窗和範圍得出的單位長,x軸,y軸    int singleUnitX;    int singleUnitY;    //根據視窗得出的多少個單位,x軸,y軸    int sumUnitX;    int sumUnitY;    point basePoint;//折線圖的原點    point xAxisEndPoint;//X軸的終點    point yAxisEndPoint;//Y軸的終點    QTimer *timer;    void getSumUnitX();    void getSingleUnitY();    void initGraph();    void flush();//資料傳入的節點不是現在的當前的節點的時候,重新整理畫面,清除所有的值};#endif // LINEGRAPHWIDGET_H

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.