QT 5 QCustomPlotを使用したリアルタイムカーブの描画
7397 ワード
組み込み開発では、収集データが受信され、リアルタイムの折れ線グラフを描く必要があります.linuxデバイスではQTがよく使われる開発フレームワークのようです.QTできれいなリアルタイムカーブを描くには、通常、QWTコントロールとQCustomPlotコントロールの2つの方法があります.QWTのインストールがかなり煩雑であるため,筆者はQCustomPlotを用いた.
一、QCustomPlotソースコードのダウンロード、解凍
QCustomPlotダウンロード
1、完全版をダウンロードして解凍し、フォルダ内のヘッダファイルqcustomplot.hとソースファイルqcustomplot.cppをコピーしてプロジェクトフォルダの下に貼り付ける.次に、新しいQTプロジェクトにこの2つのファイルを追加します.2、工事の.proファイルの9行目の末尾にprintsupportを加える.
二、uiにQCustomPlotを追加する
1、uiデザインモードに入り、widget検索を入力し、検索結果からメインウィンドウにwidget領域を追加し、追加したwidget領域を右クリックし、「昇格」ボタンを選択する.2、昇格クラス名「QCustomPlot」を入力し、「追加」をクリックします.3、QCustomPlotを選択して、昇格ボタンをクリックすると、私たちが作成したwidgetはQCustomPlotクラスに昇格します.4、次にコンパイルできます.undefined referenceのエラーが発生した場合は、最初のステップの2点目を確認してください.
PS:アップグレードは、widgetはGUIの基本コンポーネントであり、QCustomPlotのようなコントロールはwidgetの「強化版」であると理解できます.
三、QCustomPlotを使い始める
いくつかの重要なメンバー関数を説明します.
四、QtCreatorでのヘルプの使用
QCustomPlotの使用をよりよく理解するために、そのヘルプドキュメントをqt creatorに入れることができます.1、先に解凍したフォルダの下にdocumentationフォルダがあり、そのディレクトリの下にqcustomplot.qchファイルがあり、QtCreator、ツール、オプション、ヘルプ、ドキュメント、追加、qcustomplot.qchファイルを選択し、2、後で関連する関数または変数の上でF 1を押すとQCustomPlotのヘルプドキュメントにジャンプできるようになりました.
五、リアルタイム曲線の実現
筆者はlinuxでqt 5.7とQCustomPlot 1.3.2を用いたテスト
mainwindow.h
mainwindow.cpp
main.hは変わらない
一、QCustomPlotソースコードのダウンロード、解凍
QCustomPlotダウンロード
1、完全版をダウンロードして解凍し、フォルダ内のヘッダファイルqcustomplot.hとソースファイルqcustomplot.cppをコピーしてプロジェクトフォルダの下に貼り付ける.次に、新しいQTプロジェクトにこの2つのファイルを追加します.2、工事の.proファイルの9行目の末尾にprintsupportを加える.
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport
二、uiにQCustomPlotを追加する
1、uiデザインモードに入り、widget検索を入力し、検索結果からメインウィンドウにwidget領域を追加し、追加したwidget領域を右クリックし、「昇格」ボタンを選択する.2、昇格クラス名「QCustomPlot」を入力し、「追加」をクリックします.3、QCustomPlotを選択して、昇格ボタンをクリックすると、私たちが作成したwidgetはQCustomPlotクラスに昇格します.4、次にコンパイルできます.undefined referenceのエラーが発生した場合は、最初のステップの2点目を確認してください.
PS:アップグレードは、widgetはGUIの基本コンポーネントであり、QCustomPlotのようなコントロールはwidgetの「強化版」であると理解できます.
三、QCustomPlotを使い始める
いくつかの重要なメンバー関数を説明します.
addGraph() //
graph(x)->setPen(QPen(Qt::red)); //x , 0,
graph(x)->setData(x,y); // ,x y QVector
// :
//void QCPGraph::setData(const QVector &key, const QVector &value)
xAxis->setLabel("x"); //x
yAxis->setLabel("y"); //y
CustomPlot->xAxis->setRange(0,11); //x
CustomPlot->yAxis->setRange(0,11); //y
replot(); //
四、QtCreatorでのヘルプの使用
QCustomPlotの使用をよりよく理解するために、そのヘルプドキュメントをqt creatorに入れることができます.1、先に解凍したフォルダの下にdocumentationフォルダがあり、そのディレクトリの下にqcustomplot.qchファイルがあり、QtCreator、ツール、オプション、ヘルプ、ドキュメント、追加、qcustomplot.qchファイルを選択し、2、後で関連する関数または変数の上でF 1を押すとQCustomPlotのヘルプドキュメントにジャンプできるようになりました.
五、リアルタイム曲線の実現
筆者はlinuxでqt 5.7とQCustomPlot 1.3.2を用いたテスト
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include "qcustomplot.h"
//#include
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
double num[10];
int n;
void Graph_Show(QCustomPlot *customPlot);
public slots:
void Graph_Show();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
#include
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
for(int i=0;i<10;i++)
{
num[i] = 0;
}
n=0;
QTimer *timer = new QTimer(this);
timer->start(500);
connect(timer,SIGNAL(timeout()),this,SLOT(Graph_Show()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::Graph_Show()
{
QTime t;
t=QTime::currentTime();
qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
n=qrand()%50;
Graph_Show(ui->widget);
}
void MainWindow::Graph_Show(QCustomPlot *CustomPlot)
{
QVector<double> temp(10);
QVector<double> temp1(10);
for(int i=0; i<9; i++)
{
num[i]=num[i+1];
}
num[9]=n;
for(int i=0;i<10;i++)
{
temp[i] = i;
temp1[i] =num[i];
}
CustomPlot->addGraph();
CustomPlot->graph(0)->setPen(QPen(Qt::red));
CustomPlot->graph(0)->setData(temp,temp1);
CustomPlot->xAxis->setLabel("t");
CustomPlot->yAxis->setLabel("mV");
CustomPlot->xAxis->setRange(0,10);
CustomPlot->yAxis->setRange(-50,50);
CustomPlot->replot();
}
main.hは変わらない
#include "mainwindow.h"
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}