一、概述
QScatterSeries 類以散點圖的形式呈現資料。散點資料在圖表上顯示為點的集合。對於每個點,都指定了兩個值,用於確定它在水平軸和垂直軸上的位置。同時,這個這個類是繼承至 QXYSeries 類,散點圖的很多功能特性和 QLineSeries 和 QSplineSeries 基本一致的。都是橫縱座標代表一個資料。使用的一些概念的話 可以參考我的這邊 QXYSeries理論總結。 這個 類其實也就是描述這個圖含有的資料屬性。至於繪圖其實就是繪圖控制元件的事情啦。
二、使用
最簡單的一個流程用法就是:
- 宣告一個這個圖資料的物件,
- 對這個物件賦值和設定屬性
- 把這個圖資料放到顯示這個圖的控制元件上就行。
1 QScatterSeries* series = new QScatterSeries();
2 series->append(0, 6);
3 series->append(2, 4);
4 ...
5 chart->addSeries(series);
三、擴充套件
散點圖提供了兩種散點的形狀
- QScatterSeries::MarkerShapeCircle :圓形(預設的)
- QScatterSeries::MarkerShapeRectangle :方形
但是我們可以可以自己繪製這個散點的形狀,像上面的五角星即是自己繪製的形狀
四、擴充套件使用
1.建立描述散點圖物件
要建立散點圖,需要一個QScatterSeries例項。這裡我們建立了3個散點序列例項,並設定了散點形狀和散點大小。
1 QScatterSeries *series0 = new QScatterSeries();
2 series0->setName("scatter1");
3 series0->setMarkerShape(QScatterSeries::MarkerShapeCircle);
4 series0->setMarkerSize(15.0);
5
6 QScatterSeries *series1 = new QScatterSeries();
7 series1->setName("scatter2");
8 series1->setMarkerShape(QScatterSeries::MarkerShapeRectangle);
9 series1->setMarkerSize(20.0);
10
11 QScatterSeries *series2 = new QScatterSeries();
12 series2->setName("scatter3");
13 series2->setMarkerShape(QScatterSeries::MarkerShapeRectangle);
14 series2->setMarkerSize(30.0);
2. 對散點影像新增值
我們新增要顯示的資料。我們可以使用append()成員函式,也可以使用流運算子。
1 series0->append(0, 6);
2 series0->append(2, 4);
3 series0->append(3, 8);
4 series0->append(7, 4);
5 series0->append(10, 5);
6
7 *series1 << QPointF(1, 1) << QPointF(3, 3) << QPointF(7, 6) << QPointF(8, 3) << QPointF(10, 2);
8 *series2 << QPointF(1, 5) << QPointF(4, 6) << QPointF(6, 3) << QPointF(9, 5);
3. 自定義散點
我們可以將散點形狀的Brush定義為QPainter 。這裡的QPainter 是使用QPainterPath建立的星形。
1 QPainterPath starPath;
2 starPath.moveTo(28, 15);
3 for (int i = 1; i < 5; ++i) {
4 starPath.lineTo(14 + 14 * qCos(0.8 * i * M_PI),
5 15 + 14 * qSin(0.8 * i * M_PI));
6 }
7 starPath.closeSubpath();
8
9 QImage star(30, 30, QImage::Format_ARGB32);
10 star.fill(Qt::transparent);
11
12 QPainter painter(&star);
13 painter.setRenderHint(QPainter::Antialiasing);
14 painter.setPen(QRgb(0xf6a625));
15 painter.setBrush(painter.pen().color());
16 painter.drawPath(starPath);
17
18 series2->setBrush(star);
19 series2->setPen(QColor(Qt::transparent));
4. 將繪圖裝置與散點圖物件聯絡
最後我們啟用反鋸齒,設定圖表標題,並將散點序列新增到圖表中。我們還禁用了投影,因為它在只顯示圖表檢視的應用程式上看起來不太好。
1 setRenderHint(QPainter::Antialiasing);
2 chart()->addSeries(series0);
3 chart()->addSeries(series1);
4 chart()->addSeries(series2);
5
6 chart()->setTitle("Simple scatterchart example");
7 chart()->createDefaultAxes();
8 chart()->setDropShadowEnabled(false);
5. 設定座標軸
我們也可以使用散點作為圖例標記。
chart()->legend()->setMarkerShape(QLegend::MarkerShapeFromSeries);
6. 將繪圖裝置與GUI控制元件繫結並顯示
圖表已經準備好了。
1 ChartView *chartView = new ChartView();
2 QMainWindow window;
3 window.setCentralWidget(chartView);
4 window.resize(400, 300);
5 window.show();