天天看點

從零開始學Qt(74):簡單的QChart繪圖程式

作者:未來奇兵

本文用一個簡單執行個體程式說明QChart繪圖的基本原理。建立一個基于QMainWindow的應用程式,主視窗上不放置任何元件。在主視窗類中隻定義一個createChart()函數,在主視窗的構造函數中調用此函數,即:

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

createChart()函數用于建立圖表,其代碼如下:

void MainWindow::createChart()
{ //建立圖表
  QChartView *chartView=new QChartView(this); //建立 ChartView
  QChart *chart = new QChart(); //建立 Chart
  chart->setTitle("簡單函數曲線");
  chartView->setChart(chart); //Chart 添加到 ChartView
  this->setCentralWidget(chartView);
  
  //建立折順序列
  QLineSeries *seriesO = new QLineSeries();
  QLineSeries *series1 = new QLineSeries();
  seriesO->setName("Sin 曲線");
  series1->setName("Cos 曲線");
  chart->addSeries(seriesO); //序列添加到圖表
  chart->addSeries(series1);
  
  //序列添加數值
  qreal t=0,y1,y2,intv=0.1;
  int cnt=100;
  for(int i=0;i<cnt;i++){
    y1=qSin(t);//+qrand();
    seriesO->append(t,y1);
    y2=qCos(t);
    series1->append(t,y2);
    t+=intv;
  }
  
  //建立坐标軸
  QValueAxis *axisX = new QValueAxis; //X 軸
  axisX->setRange(0, 10); //設定坐标軸範圍
  axisX->setTitleText ("Angle (rad.) "); //标題
  QValueAxis *axisY = new QValueAxis; //Y 軸
  axisY->setRange(-2, 2);
  axisY->setTitleText("value");
  
  // 添加坐标軸
  chart->addAxis(axisX,Qt::AlignBottom); //為chart設定坐标軸
  chart->addAxis(axisY,Qt::AlignLeft);
  seriesO->attachAxis(axisX);
  seriesO->attachAxis(axisY);
  series1->attachAxis(axisX);
  series1->attachAxis(axisY);
}           

程式運作後界面如下圖所示。

從零開始學Qt(74):簡單的QChart繪圖程式

在createChart()函數裡,首先建立一個QChartView對象chartView,再建立一個QChart對象chart,将chart在chartView裡顯示,使用下面一行語句:

chartView->setChart(chart);           

圖表上用于顯示資料的稱為序列(series),這裡使用折順序列QLineSeries,建立了兩個QLine Series類型的序列,并且将序列添加到chart中。

chart->addSeries(series0);
chart->addSeries(series1);           

序列存儲用于顯示的資料,是以需要為直順序列添加平面資料點的坐标資料。程式生成正 弦和餘弦函數的資料作為序列的資料。

序列還需要坐标軸,建立QValueAxis類型的坐标軸作為圖表的X軸和Y軸,調用QChart的addAxis()和series的attachAxis()函數為兩個序列設定X軸和Y軸。

注意,老版本中添加坐标軸使用的是setAxisX()和setAxisY()函數,比如,

chart->setAxisX(axisX, series0);
chart->setAxisY(axisY, series0);           

這個在新版本中已經被标記為obsolete,不建議再使用。

繼續閱讀