1. 程式人生 > >Qt5--實時資料動態顯示--使用QCustomPlot庫(一)基本應用

Qt5--實時資料動態顯示--使用QCustomPlot庫(一)基本應用

 使用qcustomplot這個庫來開發。

簡單應用

檔案目錄

Graph_Widget
      |--------qcustomplot
        |------qcustomplot.cpp
        |------qcustomplot.h
        |------....
      |--------Graph_Widget.pro
      |--------Graph_Widget.pro.user
      |--------main.cpp
      |--------widget.cpp
      |--------widget
.h |--------widget.ui

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget
(parent), ui(new Ui::Widget) { ui->setupUi(this); //建立一個曲線圖表 customPlot = new QCustomPlot(this); customPlot->setObjectName(QString::fromUtf8("customPlot")); customPlot->setBackground(Qt::white); //設定背景顏色 customPlot->setGeometry(QRect(20, 20, 650, 400)); //設定 位置 高度 customPlot->plotLayout()->insertRow(0
); customPlot->plotLayout()->addElement(0, 0, new QCPPlotTitle(customPlot, "Cure")); //插入一行並且新增一個標題元素 customPlot->addGraph(); // blue line customPlot->graph(0)->setPen(QPen(Qt::blue)); customPlot->graph(0)->setBrush(QBrush(QColor(240, 255, 200))); customPlot->graph(0)->setAntialiasedFill(false); //顯示當前數值文字 textLabel = new QCPItemText(customPlot); customPlot->addItem(textLabel); textLabel->setPositionAlignment(Qt::AlignTop); //佈局內控制元件 textLabel->position->setType(QCPItemPosition::ptAxisRectRatio); //按比例設定位置,依賴於座標軸矩形大小,區別於按視口大小 textLabel->position->setCoords(0, 0); // place position at center/top of axis rect textLabel->setFont(QFont(font().family(), 15)); // make font a bit larger textLabel->setPen(QPen(Qt::black)); // show black border around text //設定當前曲線名字文字 textLabel2 = new QCPItemText(customPlot); customPlot->addItem(textLabel2); textLabel2->setPositionAlignment(Qt::AlignBottom); textLabel2->position->setType(QCPItemPosition::ptAxisRectRatio); textLabel2->position->setCoords(0, 1.0); textLabel2->setFont(QFont(font().family(), 15)); // make font a bit larger textLabel2->setPen(QPen(Qt::black)); // show black border around text CureName="123";//設定曲線名字 textLabel2->setText("CureName:"+CureName); //顯示當前值 //x座標軸設定 customPlot->xAxis->setLabel("time:");//設定座標名字 customPlot->xAxis->setLabelColor(Qt::black);//設定座標顏色 customPlot->xAxis->setLabelPadding(1);//設定座標軸名稱文字距離座標軸刻度線距離 //y座標軸設定 customPlot->yAxis->setAutoTickStep(false); ////設定是否自動分配刻度間距 customPlot->yAxis->setTickStep(25);// 數值的大小是y軸的一半,設定刻度間距 customPlot->yAxis->setLabelColor(QColor(0, 160, 230)); //設定文字顏色 customPlot->yAxis->setRange(-50,50); //y軸的範圍 customPlot->xAxis2-> setTicks(false); //不顯示座標軸 customPlot->yAxis2-> setTicks(false); //不顯示座標軸 value0=1; //測試用到 key=7; QTimer *dataTimer = new QTimer(this); connect(dataTimer, SIGNAL(timeout()), this, SLOT(realtimeDataSlot())); dataTimer->start(1000); } Widget::~Widget() { delete ui; } void Widget::realtimeDataSlot() { key++; static double lastPointKey = 0; if (key-lastPointKey > 0.01) // at most add point every 10 ms { //測試用 if(value0>0 && value0<10) { value0=value0+5; } else {value0=5;} customPlot->graph(0)->addData(key, value0); lastPointKey = key; } textLabel->setText("Current:"+QString::number( value0 )); //顯示當前值 customPlot->xAxis->setAutoTickStep(false); ////設定是否自動分配刻度間距 customPlot->xAxis->setTickStep(1);// 數值的大小是y軸的一半,設定刻度間距 customPlot->xAxis->setRange(key,8,Qt::AlignRight); customPlot->replot(); }

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

#include <qmath.h>
#include <QTimer>
#include <qcustomplot/qcustomplot.h>
#include <QString>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
    double value0;
    double key;
    QString  CureName;//設定曲線名字
    QCustomPlot *customPlot;
    QCPItemText *textLabel;
    QCPItemText *textLabel2;

private slots:
   void realtimeDataSlot();
};

#endif // WIDGET_H

上面的程式碼,那個圖表示在整個主介面上面,現在想讓它在一個固定的地方,主介面的其它地方有其他用處。在主widget裡面新增一個widget取名為widget_graph然後,在設計介面滑鼠在這個widget上面點右鍵promoted成QCousotmPlot類,有些東西就要改了。

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

#include <qmath.h>
#include <QTimer>
#include <qcustomplot/qcustomplot.h>
#include <QString>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
    double value0;
    double key;
    QString  CureName;//設定曲線名字
//    QCustomPlot *customPlot;
    QCPItemText *textLabel;
    QCPItemText *textLabel2;

private slots:
   void realtimeDataSlot();
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);


    //建立一個曲線圖表
    ui->widget_graph->setObjectName(QString::fromUtf8("customPlot"));
    ui->widget_graph->setBackground(Qt::white); //設定背景顏色

    ui->widget_graph->plotLayout()->insertRow(0);
    ui->widget_graph->plotLayout()->addElement(0, 0, new QCPPlotTitle(ui->widget_graph, "Cure")); //插入一行並且新增一個標題元素
    ui->widget_graph->addGraph(); // blue line
    ui->widget_graph->graph(0)->setPen(QPen(Qt::blue));
//    ui->widget_graph->graph(0)->setBrush(QBrush(QColor(240, 255, 200))); // 線下面的陰影的顏色
    ui->widget_graph->graph(0)->setAntialiasedFill(false);

    //設定可放大縮小
    ui->widget_graph->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);



  //顯示當前數值文字
   textLabel = new QCPItemText(ui->widget_graph);
   ui->widget_graph->addItem(textLabel);
   textLabel->setPositionAlignment(Qt::AlignTop);  //佈局內控制元件
   textLabel->position->setType(QCPItemPosition::ptAxisRectRatio); //按比例設定位置,依賴於座標軸矩形大小,區別於按視口大小
   textLabel->position->setCoords(0, 0); // place position at center/top of axis rect
   textLabel->setFont(QFont(font().family(), 15)); // make font a bit larger
   textLabel->setPen(QPen(Qt::black)); // show black border around text



    //設定當前曲線名字文字
   textLabel2 = new QCPItemText(ui->widget_graph);
   ui->widget_graph->addItem(textLabel2);
   textLabel2->setPositionAlignment(Qt::AlignBottom);
   textLabel2->position->setType(QCPItemPosition::ptAxisRectRatio);
   textLabel2->position->setCoords(0, 1.0);
   textLabel2->setFont(QFont(font().family(), 15)); // make font a bit larger
   textLabel2->setPen(QPen(Qt::black)); // show black border around text
   CureName="123";//設定曲線名字
   textLabel2->setText("CureName:"+CureName); //顯示當前值


   //x座標軸設定
   ui->widget_graph->xAxis->setLabel("time:");//設定座標名字
   ui->widget_graph->xAxis->setLabelColor(Qt::black);//設定座標顏色
   ui->widget_graph->xAxis->setLabelPadding(1);//設定座標軸名稱文字距離座標軸刻度線距離
    //y座標軸設定
   ui->widget_graph->yAxis->setAutoTickStep(false);  ////設定是否自動分配刻度間距
   ui->widget_graph->yAxis->setTickStep(25);// 數值的大小是y軸的一半,設定刻度間距
   ui->widget_graph->yAxis->setLabelColor(QColor(0, 160, 230));  //設定文字顏色
   ui->widget_graph->yAxis->setRange(0,100);   //y軸的範圍

   ui->widget_graph->xAxis2-> setTicks(false); //不顯示座標軸
   ui->widget_graph->yAxis2-> setTicks(false); //不顯示座標軸


    value0=1; //測試用到
    value1=1;
    key=7;
    QTimer *dataTimer = new QTimer(this);
    connect(dataTimer, SIGNAL(timeout()), this, SLOT(realtimeDataSlot()));
    dataTimer->start(1000);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::realtimeDataSlot()
{
    key++;
    static double lastPointKey = 0;
    if (key-lastPointKey > 0.01) // at most add point every 10 ms
    {
        //測試用
         if(value0>0 && value0<10)
        {
          value0=value0+5;
        }
        else  {value0=5;}

        ui->widget_graph->graph(0)->addData(key, value0);

        lastPointKey = key;

    }

    textLabel->setText("Current:"+QString::number( value0 )); //顯示當前值
    ui->widget_graph->xAxis->setAutoTickStep(false);  ////設定是否自動分配刻度間距
    ui->widget_graph->xAxis->setTickStep(0.5);// 數值的大小是y軸的一半,設定刻度間距
    ui->widget_graph->xAxis->setRange(key,8,Qt::AlignRight);
    ui->widget_graph->replot();
}

相關推薦

Qt5--實時資料動態顯示--使用QCustomPlot基本應用

 使用qcustomplot這個庫來開發。 簡單應用 檔案目錄 Graph_Widget |--------qcustomplot |------qcustomplot.cpp |------qcus

[PyQt5]動態顯示matplotlib作圖

完整例項 import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QMenu, QVBoxLayout, QSizePolicy, QMessageBox, QWidget, \

Linux動態之同名符號

In C++, you can mark member functions and static member variables of a class with the visibility attribute. This is useful if you know a particular method 

【數據】MySQL數據

管理系統 ins 我的電腦 使用 語句 命令行 mar alt rac 一、MySQL數據庫系統 MySQL數據庫系統就是用來對數據庫、數據的一些管理 二、數據庫系統 1.數據庫 就是用來存儲各種數據的 2.數據庫管理系統 就是用來管理各種數據庫的數據的一個系統

OSGi是什麽:Java語言的動態模塊系統

平臺 使用 數據 osgi servle http cto 優點 重啟 OSGi是什麽 OSGi亦稱做Java語言的動態模塊系統,它為模塊化應用的開發定義了一個基礎架構。OSGi容器已有多家開源實現,比如Knoflerfish、Equinox和Apache的Felix。您可

linux經典 題

awk   grep   sed1.1創建一個目錄/data。1) 解答: mkdir /data擴展:mkdir後面可以加參數-p,表示遞歸創建,也可以加參數-v,表示可以顯示出創建的過程。1.2為oldboy.txt增加內容為“I am studying linux.”。解答:為文

數據,範式

兩個 direct alt 反範式 還需 二維 查詢 block 表拆分 範式 為什麽要用範式 我們在學習關系型數據庫的時候一定有感覺,關系數據庫不就是一個二維表格嗎,那麽數據庫有什麽用? 數據庫看上去像一個表格,其實不然,比如如下的訂單表,一個訂單號X2001對應一個用戶

使用XStream解析復雜XML並插入數據

針對 很多 trac ota print root parser 沒有 jdbc 環境: Springboot+mysql 我只想說jpa真的超級好用,準備深入研究一下~ 導入依賴: <dependency> <groupId>org.proj

Exchange 2013數據可移植性恢復用戶數據

服務器 Exchange 案例講述:我目前環境中有一套Exchagne01和Exchange02服務器,全部是全角色安裝的exchange2013CU8的系統。這兩臺服務器同屬一個DAG組,由於特殊原因DAG的故障轉移群集出現問題,無法正常恢復,導致用戶郵箱不能訪問。目前發現Exchange01上的數

Robot Framework - 基礎關鍵字 BuiltIn

系列教程 判斷 機器 領域 ack ont 時間 字符串 繼續 今天給大家分享的是Robot Framework 機器人框架中 BuiltIn 基礎庫的使用。。。 BuiltIn 庫裏面提供了很多基礎方法助力於我們在自動化測試領域中做的更好!——本系列教程是教會大家如何使用

動態規劃」筆記

直接 表示 hash info 需要 clas 只需要 狀壓 技術 //主要摘抄自參考資料2333 最優性原則&&無後效性 最優子結構 狀態的轉移開銷主要包含兩個方面:每個狀態轉移的狀態數,計算新的狀態的時間. 保證從已經更新的狀態轉移過來 bool? 考慮

ELK企業應用-kibana頁面顯示不正常

ELK企業應用-kibana頁面顯示不正常(一) kibana頁面顯示不正常-Request Timeout after 30000ms 1:錯誤頁面 2:問題分析 kibana處理時間過長,應該是日誌過大導致kibana呼叫超時 檢查服務埠 埠存活 檢查

演算法基礎:資料型別,基礎結構

基礎概念 一、資料型別 基本資料型別一般長度 (注意以下的 long long 實際上指的是 unsigned long long 型別) (long long 型別數值範圍是-9223372036854775808 ~ 9223372036854775807)差不多範圍是

Python3常用資料結構及方法介紹——列表

一.列表 list 1特點: ①列表可更改 ②方括號 [1, 2, 3] 2常用列表操作: ①索引: >>> list1 = [1,2,3,4,5,6,7,8,9,10] >>> list1[4] 5 ②分片: >>>

北京理工大學-資料結構期末考試試題

資料結構試卷(一) 一、單選題(每題 2 分,共20分) 1.    棧和佇列的共同特點是(      )。  A.只允許在端點處插入和刪除元素

如何生成自定義的逆向檔案頻率IDF文字語料

  在基於TF-IDF進行特徵提取時,因為文字背景是某一具體行業,不適合使用通用的IDF語料庫,我覺得應該使用自定義的基於該行業背景的IDF語料庫。請問如何生成自定義IDF語料庫呢? 我現在有的資料是幾十萬個該行業的文件,初步想法是:對每個文件分詞去重,把所有文件分詞結果彙集去重後

MySQL數據編譯安裝、安裝後優化操作及超戶忘記數據密碼的解決方法

conf sco 試用 初始化 configure 修改 load his 解決方法 MySQL的下載地址:http://www.dev.mysql.com/downloads 準備工作:卸載rpm方式安裝的mysql-server、mysql       rpm -qa

Golang 通過 cgo 呼叫 C/C++ 靜態

hello.h #ifndef HELLO_H_ #define HELLO_H_ #ifdef __cplusplus extern "C" { #endif extern int hello(char *name, int age); #ifdef __cplusplus

資料結構之堆疊佇列

目錄 資料結構值堆疊佇列           1.堆 2.棧  -- 作業系統在建立某個程序時或者執行緒為這個執行緒建立儲存區域 3.堆、棧區別總結: 4.佇列 5.堆、棧、佇列三者區別 

資料學習初級入門教程 —— Hadoop 2.x 的安裝、啟動和測試

大資料最基礎的就是資料的儲存和計算,而 Hadoop 就是為儲存和計算而生,是最基礎的大資料處理工具。這篇簡單寫寫 Hadoop 2.x 的安裝,啟動和測試。 一、準備環境 大資料環境的部署,一般都是叢集,機器數量為奇數,這裡以 5 臺機器為例,作業系統為 CentOS 6.9_x64;