728x90

Qt 데이터 시각화 도구 QCustomPlot 사용하기(2)를 안보셨다면 먼저 보시는 것을 추천드립니다.

 

Qt 데이터 시각화 도구 QCustomPlot 사용하기(2)

Qt 데이터 시각화 도구 QCustomPlot 사용하기(1)를 안보셨다면 먼저 보시는 것을 추천드립니다. Qt 데이터 시각화 도구 QCustomPlot 사용하기(1) QCustomPlot은 Qt에서 사용할 수 있는 데이터 시각화 위젯입니

1d1cblog.tistory.com

다음으로 데이터를 100ms 마다 추가할 때 그래프를 옆으로 옮겨보겠습니다. 

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

    nIndex = 0;

    ...
    connect(ui->pbStop, SIGNAL(clicked()), &timer, SLOT(stop()));

    qsrand(QTime::currentTime().msec());
    connect(&timer, SIGNAL(timeout()),this,SLOT(Slot_addData()));
    timer.start(100);

    ui->plot->replot();
}

void MainWindow::Slot_addData()
{
    int nRand = qrand() % 11;
    ui->plot->graph(0)->addData(nIndex++, nRand);
    if ( nIndex >= 20 ) {
        ui->plot->xAxis->moveRange(1);
    }

    ui->plot->replot();
}

100 ms마다 데이터가 추가되고 추가 종료 버튼을 누르면 타이머가 종료됩니다.

이전 데이터를 보거나 드래그를 통해 확대 / 축소 등의 기능을 plot에 추가하고 싶을때는 setInteractions을 통해 설정하면 됩니다.

드래그, 줌, 그래프 선택, 축 선택, 범례 선택 옵션을 추가했습니다.

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

    ui->plot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | 
    					QCP::iSelectPlottables | QCP::iSelectAxes | QCP::iSelectLegend);
    ui->plot->replot();
}

  • 레이어

qcustomPlot에는 레이어 개념이 적용되어 있습니다. 현재 레이어는 총 8가지 입니다. 아래 코드는 qcustomplot.cpp의 일부입니다.

  mLayers.append(new QCPLayer(this, QLatin1String("background")));
  mLayers.append(new QCPLayer(this, QLatin1String("grid")));
  mLayers.append(new QCPLayer(this, QLatin1String("main")));
  mLayers.append(new QCPLayer(this, QLatin1String("axes")));
  mLayers.append(new QCPLayer(this, QLatin1String("graph")));
  mLayers.append(new QCPLayer(this, QLatin1String("selectedgraph")));
  mLayers.append(new QCPLayer(this, QLatin1String("legend")));
  mLayers.append(new QCPLayer(this, QLatin1String("overlay")));

좌표 설명을 해주는 QItemText처럼 overlay로 설정을 해준 아이템들을 통합적으로 관리를 할 수 있습니다.

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

    ...
    QCPItemText* itemText = new QCPItemText(ui->plot);
    itemText->setLayer("overlay");
    ...
//    m_ItemText->setVisible(false);
    ui->plot->layer("overlay")->setVisible(false);

    ...
    ui->plot->replot();
}

void MainWindow::Slot_clickGraph(QCPAbstractPlottable* potItem, int num, QMouseEvent* event)
{
    double dX = potItem->interface1D()->dataMainKey(num);
    double dY = potItem->interface1D()->dataMainValue(num);
//    m_ItemText->setVisible(true);
    ui->plot->layer("overlay")->setVisible(true);

    m_ItemText->setText(QString("Point Information\nX = %1\nY = %2")
    			.arg(QString::number(dX)).arg(QString::number(dY)));

    ui->plot->replot();
}

 

 

psy1064/qCustomPlot-example

qCustomPlot example. Contribute to psy1064/qCustomPlot-example development by creating an account on GitHub.

github.com

 

728x90

+ Recent posts