天天看點

QT5.14.2 官方例子 - Qt Charts 1: Chart Themes Example(圖表主題)

這個示例展示了圖表在不同内置主題的外觀。

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

QT5.14.2 官方例子 - Qt Charts 1: Chart Themes Example(圖表主題)
QT5.14.2 官方例子 - Qt Charts 1: Chart Themes Example(圖表主題)

具體講解在:

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.區域圖繪畫:

QT5.14.2 官方例子 - Qt Charts 1: Chart Themes Example(圖表主題)
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.餅狀圖繪畫:

QT5.14.2 官方例子 - Qt Charts 1: Chart Themes Example(圖表主題)
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.折線圖繪畫:

QT5.14.2 官方例子 - Qt Charts 1: Chart Themes Example(圖表主題)
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.條形圖:

QT5.14.2 官方例子 - Qt Charts 1: Chart Themes Example(圖表主題)
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.曲線圖:

QT5.14.2 官方例子 - Qt Charts 1: Chart Themes Example(圖表主題)
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.散步圖:

QT5.14.2 官方例子 - Qt Charts 1: Chart Themes Example(圖表主題)
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;
}
           

繼續閱讀