這個示例展示了圖表在不同内置主題的外觀。
此示例顯示了一些受支援的圖表類型的不同内置主題的外觀。

具體講解在:
http://doc.qt.io/qt-5/qtcharts-chartthemes-example.html
主要類:
QPair:
QPair<int, string>
類模闆:
template <class T1, class T2> struct pair
參數:class T1是第一個值的資料類型,class T2是第二個值的資料類型。
功能:pair将一對值(可以是不同的資料類型)組合成一個值,兩個值可以分别用pair的兩個公有函數first和second通路。
https://blog.csdn.net/Superman___007/article/details/89335836
QChartView: QChartView是一個可以顯示圖表的獨立小部件。圖表需要顯示在該部件上。
QChart:QChart類管理圖表系列、圖例和軸的圖形表示。各種類型圖需要顯示在圖表上。
QLineSeries: QLineSeries類用折線圖表示資料。
QStackedBarSeries: QStackedBarSeries類将一系列資料顯示為垂直堆疊的條形圖,每個類别有一個條形圖。
QPieSlice: QPieSeries類以餅狀圖的形式表示資料。
QSplineSeries: QSplineSeries類将資料表示為樣條圖。
QScatterSeries:QScatterSeries類用散點圖表示資料。
主要過程:
1.如何根據主題,動畫,圖例文字的靠近的位置來更新所有的圖表;
void ThemeWidget::updateUI()
{
//![6] 擷取目前選中的主題
QChart::ChartTheme theme = static_cast<QChart::ChartTheme>(
m_ui->themeComboBox->itemData(m_ui->themeComboBox->currentIndex()).toInt());
//![6]
const auto charts = m_charts;
// 如果存入的chartview為空,并且第零個和目前選中的主題不一緻,則更新view的主題
if (!m_charts.isEmpty() && m_charts.at(0)->chart()->theme() != theme)
{
for (QChartView *chartView : charts)
{
//![7] 更新目前視圖對應的圖表的主題
chartView->chart()->setTheme(theme);
//![7]
}
// Set palette colors based on selected theme
//![8]
QPalette pal = window()->palette();
if (theme == QChart::ChartThemeLight)
{
pal.setColor(QPalette::Window, QRgb(0xf0f0f0));
pal.setColor(QPalette::WindowText, QRgb(0x404044));
//![8]
}
else if (theme == QChart::ChartThemeDark)
{
pal.setColor(QPalette::Window, QRgb(0x121218));
pal.setColor(QPalette::WindowText, QRgb(0xd6d6d6));
}
else if (theme == QChart::ChartThemeBlueCerulean)
{
pal.setColor(QPalette::Window, QRgb(0x40434a));
pal.setColor(QPalette::WindowText, QRgb(0xd6d6d6));
}
else if (theme == QChart::ChartThemeBrownSand)
{
pal.setColor(QPalette::Window, QRgb(0x9e8965));
pal.setColor(QPalette::WindowText, QRgb(0x404044));
}
else if (theme == QChart::ChartThemeBlueNcs)
{
pal.setColor(QPalette::Window, QRgb(0x018bba));
pal.setColor(QPalette::WindowText, QRgb(0x404044));
}
else if (theme == QChart::ChartThemeHighContrast)
{
pal.setColor(QPalette::Window, QRgb(0xffab03));
pal.setColor(QPalette::WindowText, QRgb(0x181818));
}
else if (theme == QChart::ChartThemeBlueIcy)
{
pal.setColor(QPalette::Window, QRgb(0xcee7f0));
pal.setColor(QPalette::WindowText, QRgb(0x404044));
}
else
{
pal.setColor(QPalette::Window, QRgb(0xf0f0f0));
pal.setColor(QPalette::WindowText, QRgb(0x404044));
}
// 根據選中的主題,并設定對應的視窗顔色和視窗文本的顔色,來設定目前視窗的顔色
window()->setPalette(pal);
}
// Update antialiasing
//![11]
bool checked = m_ui->antialiasCheckBox->isChecked();
// 根據反鋸齒設定來比對所有圖表的反鋸齒
for (QChartView *chart : charts)
chart->setRenderHint(QPainter::Antialiasing, checked);
//![11]
// Update animation options
//![9]
QChart::AnimationOptions options(
m_ui->animatedComboBox->itemData(m_ui->animatedComboBox->currentIndex()).toInt());
// 按照目前animation的項,來更新圖示的視圖
if (!m_charts.isEmpty() && m_charts.at(0)->chart()->animationOptions() != options)
{
for (QChartView *chartView : charts)
chartView->chart()->setAnimationOptions(options);
}
//![9]
// Update legend alignment
//![10]
Qt::Alignment alignment(
m_ui->legendComboBox->itemData(m_ui->legendComboBox->currentIndex()).toInt());
// 根據選中圖例文字的靠向,來設定實際圖例文字的靠向
if (!alignment) {
for (QChartView *chartView : charts)
chartView->chart()->legend()->hide();
}
else
{
for (QChartView *chartView : charts)
{
chartView->chart()->legend()->setAlignment(alignment);
chartView->chart()->legend()->show();
}
}
//![10]
}
2.圖表中三條線的所有點資料資訊:
DataTable ThemeWidget::generateRandomData(int listCount, int valueMax, int valueCount) const
{
DataTable dataTable;
// generate random data
// m_dataList: 中三個成員,即三條線的資料
for (int i(0); i < listCount; i++)
{
DataList dataList;
qreal yValue(0);
// valueMax: 10
// valueCount: 7
for (int j(0); j < valueCount; j++)
{
// [static] QRandomGenerator *QRandomGenerator::global():
// 傳回一個指向使用securelyseed()進行種子化的共享QRandomGenerator的指針。
// 這個函數應該用于建立随機資料,而不需要為特定用途建立安全的QRandomGenerator,
// 也不需要存儲相當大的QRandomGenerator對象。
// double QRandomGenerator::bounded(double highest):
// 生成一個在0(包含)和最高(排除)之間的随機雙精度值。該函數等價于并實作為:
// return generateDouble() * highest;
// 最大參數為負,結果也為負;如果它是無窮大或NaN,結果将是無窮大或NaN也是(即,不是随機的)。
yValue = yValue + QRandomGenerator::global()->bounded(valueMax / (qreal) valueCount);
QPointF value((j + QRandomGenerator::global()->generateDouble()) * ((qreal) m_valueMax / (qreal) valueCount),
yValue);
QString label = "Slice " + QString::number(i) + ":" + QString::number(j);
// QRandomGenerator類允許從高品質的随機數生成器中擷取随機值。
qDebug() << "random value: " << QRandomGenerator::global()->generateDouble();
qDebug() << "xValue: " << (j + QRandomGenerator::global()->generateDouble()) * ((qreal) m_valueMax / (qreal) valueCount);
qDebug() << "yValue: " << yValue;
qDebug() << "label: " << label;
// 将(點位置,标簽名)添加到資料清單dataList中
dataList << Data(value, label);
}
// 将三條線的資料逐條添加進資料表中
dataTable << dataList;
}
return dataTable;
}
2.區域圖繪畫:
QChart *ThemeWidget::createAreaChart() const
{
// 建立表格
QChart *chart = new QChart();
// 設定标題
chart->setTitle("Area chart");
// The lower series initialized to zero values
// QLineSeries: 折線圖是用直線連接配接的一系列資料點來顯示資訊的。
QLineSeries *lowerSeries = 0;
QString name("Series ");
int nameIndex = 0;
for (int i(0); i < m_dataTable.count(); i++)
{
// 為該表格建立上行線型圖
QLineSeries *upperSeries = new QLineSeries(chart);
for (int j(0); j < m_dataTable[i].count(); j++)
{
Data data = m_dataTable[i].at(j);
// 如果底行超過了x軸,即lowerSeries>0, 則需要加上底軸的y坐标;
if (lowerSeries)
{
const QVector<QPointF>& points = lowerSeries->pointsVector();
upperSeries->append(QPointF(j, points[i].y() + data.first.y()));
}
else
{
// 将某一條折線圖的上行的點,一一填入upperSeries
upperSeries->append(QPointF(j, data.first.y()));
qDebug() << "x: " << j;
qDebug() << "y: " << data.first.y();
}
}
// 一條上行折線 + 一條下行折線 =》 一個區域圖
QAreaSeries *area = new QAreaSeries(upperSeries, lowerSeries);
area->setName(name + QString::number(nameIndex));
nameIndex++;
// 為表格添加該區域圖
chart->addSeries(area);
// 把上次的上行指派給下一次的底行,這樣就開始疊代往上
lowerSeries = upperSeries;
}
// 根據已經添加到圖表中的系列為圖表建立軸。之前添加到圖表中的任何軸都将被删除。
chart->createDefaultAxes();
// x,y: 添加x,y軸的坐标值
chart->axes(Qt::Horizontal).first()->setRange(0, m_valueCount - 1);
chart->axes(Qt::Vertical).first()->setRange(0, m_valueMax);
// Add space to label to add space between labels and axis
QValueAxis *axisY = qobject_cast<QValueAxis*>(chart->axes(Qt::Vertical).first());
Q_ASSERT(axisY);
// 設定Y軸坐标的精确度
axisY->setLabelFormat("%.2f ");
return chart;
}
3.餅狀圖繪畫:
QChart *ThemeWidget::createPieChart() const
{
QChart *chart = new QChart();
chart->setTitle("Pie chart");
QPieSeries *series = new QPieSeries(chart);
for (const Data &data : m_dataTable[0])
{
QPieSlice *slice = series->append(data.second, data.first.y());
if (data == m_dataTable[0].first())
{
// Show the first slice exploded with label
slice->setLabelVisible();
// 設定這片是否和餅狀圖分開
slice->setExploded();
// 設定分開的距離為0.5
slice->setExplodeDistanceFactor(0.5);
}
}
// 設定餅狀圖的半徑為0.4,範圍在:(0,1)
series->setPieSize(0.4);
// 表格添加該餅狀圖
chart->addSeries(series);
return chart;
}
4.折線圖繪畫:
QChart *ThemeWidget::createLineChart() const
{
//![1]
QChart *chart = new QChart();
chart->setTitle("Line chart");
//![1]
//![2]
QString name("Series ");
int nameIndex = 0;
// m_dataTable: QList<DataList>
// QList<Data> DataList;
// QPair<QPointF, QString> Data;
for (const DataList &list : m_dataTable)
{
QLineSeries *series = new QLineSeries(chart);
for (const Data &data : list)
// 将一條線的點位置資料(data.first)添加到線性圖(series)中
series->append(data.first);
series->setName(name + QString::number(nameIndex));
nameIndex++;
// 添加一條線性圖
chart->addSeries(series);
}
//![2]
//![3]
// 根據已經添加到圖表中的系列為圖表建立(x,y)軸。之前添加到圖表中的任何軸都将被删除。
chart->createDefaultAxes();
chart->axes(Qt::Horizontal).first()->setRange(0, m_valueMax);
chart->axes(Qt::Vertical).first()->setRange(0, m_valueCount);
//![3]
//![4]
// Add space to label to add space between labels and axis
QValueAxis *axisY = qobject_cast<QValueAxis*>(chart->axes(Qt::Vertical).first());
Q_ASSERT(axisY);
axisY->setLabelFormat("%.1f ");
//![4]
return chart;
}
5.條形圖:
QChart *ThemeWidget::createBarChart(int valueCount) const
{
Q_UNUSED(valueCount);
QChart *chart = new QChart();
chart->setTitle("Bar chart");
// StackedBar:堆疊條形圖
QStackedBarSeries *series = new QStackedBarSeries(chart);
for (int i(0); i < m_dataTable.count(); i++)
{
// 添加一種條形圖barset
QBarSet *set = new QBarSet("Bar set " + QString::number(i));
for (const Data &data : m_dataTable[i])
// 添加目前的點的y坐标,到該條形圖中
*set << data.first.y();
// 添加該條形圖到堆疊條形圖中
series->append(set);
}
// 添加堆疊條形圖到圖表内
chart->addSeries(series);
chart->createDefaultAxes();
chart->axes(Qt::Vertical).first()->setRange(0, m_valueMax * 2);
// Add space to label to add space between labels and axis
QValueAxis *axisY = qobject_cast<QValueAxis*>(chart->axes(Qt::Vertical).first());
Q_ASSERT(axisY);
axisY->setLabelFormat("%.1f ");
return chart;
}
6.曲線圖:
QChart *ThemeWidget::createSplineChart() const
{
QChart *chart = new QChart();
chart->setTitle("Spline chart");
QString name("Series ");
int nameIndex = 0;
for (const DataList &list : m_dataTable)
{
// 建立一條曲線圖
QSplineSeries *series = new QSplineSeries(chart);
for (const Data &data : list)
// 添加一個資料的所有的點位置資料到曲線圖中
series->append(data.first);
series->setName(name + QString::number(nameIndex));
nameIndex++;
chart->addSeries(series);
}
chart->createDefaultAxes();
chart->axes(Qt::Horizontal).first()->setRange(0, m_valueMax);
chart->axes(Qt::Vertical).first()->setRange(0, m_valueCount);
// Add space to label to add space between labels and axis
QValueAxis *axisY = qobject_cast<QValueAxis*>(chart->axes(Qt::Vertical).first());
Q_ASSERT(axisY);
axisY->setLabelFormat("%.1f ");
return chart;
}
7.散步圖:
QChart *ThemeWidget::createScatterChart() const
{
// scatter chart
QChart *chart = new QChart();
chart->setTitle("Scatter chart");
QString name("Series ");
int nameIndex = 0;
for (const DataList &list : m_dataTable)
{
// 建立一條散布圖
QScatterSeries *series = new QScatterSeries(chart);
for (const Data &data : list)
series->append(data.first);
series->setName(name + QString::number(nameIndex));
nameIndex++;
chart->addSeries(series);
}
chart->createDefaultAxes();
chart->axes(Qt::Horizontal).first()->setRange(0, m_valueMax);
chart->axes(Qt::Vertical).first()->setRange(0, m_valueCount);
// Add space to label to add space between labels and axis
QValueAxis *axisY = qobject_cast<QValueAxis*>(chart->axes(Qt::Vertical).first());
Q_ASSERT(axisY);
axisY->setLabelFormat("%.1f ");
return chart;
}