Qt Charts 概述

Qt Charts 模块是一组易于使用的图标组件,它基于 Qt 的 Graphice View 架构,其核心组件是 QChartViewQChartQChartView 的父类是 QGraphicsView,就是 Graphics View 架构中的视图组件,所以,QChartView 是用于显示图标的视图。

QChart 的继承关系如图:

可以看到,QChart 是从 QGraphicsItem 继承而来的,所以,QChart 是一种图形像。

QPolarChart 是用于绘制极坐标图的图表类,它从 QChart 继承而来。

想要使用 Qt Charts 模块,必须在项目的配置文件重添加模块。

Plain Text Qt += charts

在需要使用 QtCharts 的类的头文件或者源文件中,需要使用如下的包含语句:

# include
using namespace QtCharts;

或者可以使用宏定义:

# include
Qt_CHARTS_USE_NAMESPACE

简单的 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* series0 = new QLineSeries();
QLineSeries* series1 = new QLineSeries();
series0->setName("Sin");
series1->setName("Cos");
chart->addSeries(series0);
chart->addSeries(series1);

// 序列添加数值
qreal t = 0, y1, y2, intv = 0.1;
int cnt = 100;
for (int i = 0; i < cnt; i++) {

    y1 = qSin(t);
    series0->append(t, y1);
    y2 = qSin(t + 20);
    series1->append(t, y2);
    t += intv;
}

// 创建坐标值
QValueAxis* axisX = new QValueAxis();
axisX->setRange(0, 10);
axisX->setTitleText("time(secs)");

QValueAxis* axisY = new QValueAxis();
axisY->setRange(-2, 2);
axisY->setTitleText("value");

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

}

在 createChart () 函数中,首先创建一个 QChartView 对象 chartView,再创建一个 QChart 对象 chart,将 chart 在 chartVIew 里显示,使用下面这行语句:

chartView->setChart(chart);

图表上用于显示数据的称为序列(series),这里使用折线序列 QLineSeries,创建了两个 QLineSeries 类型的序列,并且将序列添加到 chart 中。

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

序列存储用来显示数据,所以需要为直线序列添加平面数据点的坐标数据。程序将生成正弦和余弦函数的数据作为序列数据。

序列好需要坐标轴,创建 QValueAxis 类型的坐标轴作为图表的 X 轴和 Y 轴,调用 QChart 的 setAxisX () 和 setAxisY () 函数为两个序列分别设置 X 轴和 Y 轴。

图表的主要组成部分

QChartView 的功能

QChartView 是 QChart 的视图组件,类似 Graphics View 架构中的 QGraphicsView。实际上,在窗口设计界面上使用 QChartView 时,就是先放置一个 QGraphicsView 组件,然后升级为 QChartView。

QChartView 类定义的函数很少,只有下面几个。

  • void setChart(QChart* chart),设置一个 QChart 对象作为显示的图表。
  • QChart* chart(),返回 QChartView 当前设置的 QChart 类对象。
  • void setRubberBand(RubberBands &rubberBand),设置选择框的类型,即鼠标在视图组件上拖动选择范围的方式,是一个 QChartView::RubberBand 枚举类型的组合,QChartView::RubberBand 枚举类型有以下几种取值:
  • QChartView::NoRubberBand:无选择框;
  • QChartView::VerticalRubberBand:垂向选择;
  • QChartView::HorizontalRubberBand:水平选择;
  • QChartView::RectangleRubberBand:矩形框选择。
  • RubberBands rubberBand(),返回设置的选择框类型。

序列

序列是数据的表现形式,上图就是两个 QLineSeries 类型的序列。序列的继承关系如下:

从上图可以看出序列类的继承关系,他们都是从 QAbstractSeries 类继承而来。折线、光滑曲线和散点的序列是从 QXYSeries 继承而来,用于绘制二维平面数据;QAbstractBarSeries 派生出柱状图、百分比柱状图和堆叠图等图标的序列;面积图、火柴盒图、饼图的序列都是直接继承于 QAbstractSeries

坐标轴

|坐标轴类|特点|用途| |-|-|-| |QValueAxis|数值坐标轴|作为数值类型数据的坐标轴| |QCategoryAxis|分组数值坐标轴|可以为数值范围设置文字标签| |QLogValueAxis|对数数值坐标轴|作为数值类型数据的对数坐标轴,可以设置对数的基| |QBarCategoryAsix|类别坐标轴|用字符串作为坐标轴的刻度,用于图表的非数值坐标轴| |QDateTimeAxis|日志时间坐标轴|作为日期时间数据的坐标轴|

图例

图例(Legend)是对图表上显示的序列的示例说明,有线条颜色和文字说明。QLegend 是封装了图例控制功能的类,可以为每个序列设置图例中的文字,可以控制图例显示在图表的上、下、左、右不同位置。

这一篇我们详细介绍图表各个部分的设置和操作,包括图表的标题、图例、边距等属性设置,QLineSeries 序列的属性设置,QValueAxis 坐标轴的属性设置,以及图标的缩放。(这些应该都是在实际的 Qt 开发中比较常用的图表操作)先看运行时的界面:

界面设计

  • 工具栏:创建几个 Action,并创建工具栏,实现图表数据刷新和缩放功能。
  • 主工作区图标视图:从组件面板放置一个 QGraphics View 组件作为视图组件,并用 Promote 方法升级为 QChartView 组件,命名为 chartView
  • 图表属性设置面板:左侧是一个 QToolBox 组件,分为 3 个操作面板,用于进行图表设置、曲线设置和坐标轴设置。

主窗口类的定义和初始化

下面是主窗口类 MainWindow 的类定义(省略了 Action 和界面组件的槽函数定义)。在 mainwindow.h 文件重需要包含 QtChart,并使用宏 QT_CHARTS_USE_NAMESPACE 导入命名空间。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtCharts>
QT_CHARTS_USE_NAMESPACE
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:

    QLineSeries* curSeries; // 当前序列
    QValueAxis* curAxis; // 当前坐标轴
    void createChart(); // 创建图表
    void prepareData(); // 更新数据
    void updateFromChart(); // 从图表更新到界面

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

MainWindow 类中定义了两个私有的变量,curSeries 用于指向当前的 QLineSeries 序列,界面上对序列的设置操作都是针对当前选择的序列;curAxis 用于指向当前的 QValueAxis 坐标轴,对坐标轴进行设置时就是针对当前坐标轴进行设置。

createChart() 函数用于创建图表的各个基本部件,在构造函数里调用,prepareData() 用于更新序列的数据,updateFormChart() 用于读取图表的一些属性,并刷新界面显示。下面是主窗口构造函数,以及这 3 个函数的代码。

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    createChart(); // 创建图表
    prepareData(); // 生成数据
    updateFromChart(); // 从图表获取属性值,刷新到界面显示
}

void MainWindow::createChart()
{
    QChart* chart = new QChart();
    chart->setTitle("简单函数曲线");
    ui->chartView->setChart(chart);
    ui->chartView->setRenderHint(QPainter::Antialiasing); // 抗锯齿,平滑

    QLineSeries* series0 = new QLineSeries();
    QLineSeries* series1 = new QLineSeries();
    series0->setName("Sin 曲线");
    series1->setName("Cos 曲线");
    curSeries = series0;

    QPen pen;
    pen.setStyle(Qt::DotLine);
    pen.setWidth(2);
    pen.setColor(Qt::red);
    series0->setPen(pen);
    pen.setStyle(Qt::SolidLine);
    pen.setColor(Qt::blue);
    series1->setPen(pen);
    chart->addSeries(series0);
    chart->addSeries(series1);

    QValueAxis* axisX = new QValueAxis();
    curAxis = axisX;
    axisX->setRange(0, 10);
    axisX->setLabelFormat("%.1f"); // 标签格式
    axisX->setTickCount(11); // 主分隔个数
    axisX->setMinorTickCount(9); // 次分隔个数
    axisX->setTitleText("time(secs)"); // 标题

    QValueAxis* axisY = new QValueAxis();
    axisY->setRange(-2, 2);
    axisY->setTitleText("value");
    axisY->setTickCount(5);
    axisY->setLabelFormat("%.2f");
    axisY->setMinorTickCount(4);

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

void MainWindow::prepareData()
{
    QLineSeries* series0 = (QLineSeries*)ui->chartView->chart()->series().at(0);
    QLineSeries* series1 = (QLineSeries*)ui->chartView->chart()->series().at(1);

    series0->clear();
    series1->clear();

    qsrand(QTime::currentTime().second()); // 初始化随机数
    qreal t = 0;
    qreal y1, y2;
    qreal intv = 0.1;
    qreal rd;
    int cnt = 100;

    for (int i = 0; i < cnt; i++) {

        rd = (qrand() % 10) - 5;
        y1 = qSin(t) + rd / 50;
        series0->append(t, y1);
        rd = (qrand() % 10) - 5;
        y2 = qCos(t) + rd / 50;
        series1->append(t, y2);
        t += intv;
    }
}

void MainWindow::updateFromChart()
{
    QChart* chart = ui->chartView->chart();
    ui->editTitle->setText(chart->title());
    QMargins mg = chart->margins(); // 边距
    ui->spinMarginTop->setValue(mg.top());
    ui->spinMarginLeft->setValue(mg.left());
    ui->spinMarginRight->setValue(mg.right());
    ui->spinMarginBottom->setValue(mg.bottom());
}
  • MainWindow 类个构造函数调用单个私有函数进行图表和界面的初始化。
  • createChart() 函数用于创建 QChart 对象,创建数据序列和坐标轴,并将这些部件组合成一个完整的图表。
  • prepareDate() 函数用于为图表重的两个序列生成数据,其中使用随机数,以便使得每次生成的数据稍有不同。
  • updateFromChart() 函数用于将图表重的标题和边距信息显示到窗口界面上。

笔画设置对话框 QWDialogPen

在这个 demo 中,需要设置一些对象的 pen 属性,比如折线序列的 pen 属性,网络先的 pen 属性等。pen 属性其实就是一个 QPen 对象,设置内容主要包括线型,线宽和颜色。为了使用方便,设计一个自定义对话框 QWDialogPen,专门用于 QPen 对象的属性设置。

QWDialogPen 是一个可视化设计的对话框,其类型定义如下:

class QWDialogPen : public QDialog
{
    Q_OBJECT

public:
    explicit QWDialogPen(QWidget *parent = nullptr);
    ~QWDialogPen();

    void setPen(QPen pen); // 设置Qpen,用于对话框界面显示
    QPen getPen(); // 获取对话框设置的QPen属性
    static QPen getPen(QPen iniPen, bool& ok); //静态函数

private slots:
    void on_btnColor_clicked();

private:
    Ui::QWDialogPen *ui;
    QPen m_pen;
};

QWDialogPen 类的 getPen() 以及相关函数的实现代码如下:

void QWDialogPen::setPen(QPen pen)
{
    m_pen = pen;
    ui->spinWidth->setValue(pen.width());
    int i = static_cast<int>(pen.style());
    ui->comboPenStyle->setCurrentIndex(i);
    QColor color = pen.color();
    ui->btnColor->setAutoFillBackground(true);
    QString str = QString::asprintf("background-color: rgb(%d,%d,%d);", color.red(), color.green(), color.blue());
    ui->btnColor->setStyleSheet(str);
}

QPen QWDialogPen::getPen()
{
    m_pen.setStyle(Qt::PenStyle(ui->comboPenStyle->currentIndex()));
    m_pen.setWidth(ui->spinWidth->value());
    QColor color = ui->btnColor->palette().color(QPalette::Button);
    m_pen.setColor(color);
    return m_pen;
}

QPen QWDialogPen::getPen(QPen iniPen, bool &ok)
{
    QWDialogPen* dlg = new QWDialogPen();
    dlg->setPen(iniPen);
    QPen pen;
    int ret = dlg->exec(); // 弹出对话框
    if (ret == QDialog::Accepted) {

        pen = dlg->getPen(); // 获取
        ok = true;
    }
    else {

        pen = iniPen;
        ok = false;
    }

    delete dlg; // 删除对话框对象
    return pen; //返回设置的QPen对象
}

静态函数 getPen() 里创建了一个 QWDialogPen 类的实例 dlg,然后调用 dlg→setPen(iniPen) 进行初始化,运行对话框并获取返回值,若返回值为 QDialog::Accepted,就调用 dlg→getPen() 获取设置属性后的 QPen 对象,最后删除对话框对象并返回设置的 Qpen 对象。所以,静态函数 getPen() 就是集成了普通方法调用对话框时创建对话框,设置初始值、获取对话框返回状态、获取返回删除对话框的过程,简化了调用代码。

QChart 设置

QChart 类的主要函数

| 分组 | 函数名 | 功能描述 |
| :—: | — | — |
| 图表外观 | void setTitle () | 设置图表标题,支持 HTML |
| | void setTitleFont () | 设置图表标题字体 |
| | void setTitleBrush () | 设置比图表标题画刷 |
| | void setTheme () | 设置主题,定义了图表的配色 |
| | void setMargins () | 设置绘图区与图表边界的四个边距 |
| | QLegend* legend () | 返回图表的图例,是一个 QLegend 类对象 |
| | void setAnimationOptions () | 设置序列或坐标轴的动画效果 |
| 数据序列 | void addSeries () | 添加序列 |
| | QList>series () | 返回图表拥有的序列的列表 |
| | void removeSeries () | 移除一个序列,但并不删除序列对象 |
| | void removeAllSeries () | 移除并删除图表的所有序列 |
| 坐标轴 | void addAxis () | 为图表的某个方向添加坐标轴 |
| | QList> axes () | 返回某个方向的坐标轴列表 |
| | void setAxisX () | 设置某个序列的水平方向的坐标轴 |
| | void setAxisY () | 设置某个序列的垂直方向的坐标轴 |
| | void removeAxis () | 移除一个坐标轴 |
| | void createDefaultAxes () | 更具已添加的序列类型,创建缺省的坐标轴,前面已有的坐标轴会被删除 |

通过图表的设置界面可以设置标题的内容和字体,可以设置图例的位置,是否显示,字体颜色和边距;可以设置动画效果和主题。

setAnimationOptions(AnimationOptions options) 函数设置图表的动画效果,输入参数是 QChart::AnimationOption 枚举类型,有以下取值:

  • QChart::NoAnimation:无动画效果;
  • QChart::GridAxisAnimations:背景网格有动画;
  • QChart::SeriesAnimations:序列有动画效果;
  • QChart::AllAnimations:都有动画效果。

主题是预定义的图表配色样式,是 QChart::ChartTheme 枚举类型,有多种取值。

图例是一个 QLegend 类对象,通过 QChart::legend() 可以获取图表的图例。图例是根据添加的序列自动生成的,但是可以修改一些属性,如:位置,文字和字体等。例如:

ui->chartView->chart()->legend()->setAlignment(Qt::AlignBottom);

void MainWindows::on_btnLegendFont_clicked() {

    QFont font = ui->chartView->chart()->legend()->font();
    bool ok = false;
    font = QFontDialog::getFont(&ok, font);
    if (ok) {
      ui->chartView->chart()->legend()->setFont(font);
    }
}

QLineSeries 序列设置

在这个项目中,我们使用的是 QLineSeries,他是 QXYSeries 的子类,用于绘制二维数据的折线图。QLineSeries 的主要函数(包括从父类集成的函数,省略参数)如下:

| 分组 | 函数 | 功能描述 |
| :—: | — | — |
| 序列名称 | void setName () | 设置序列名称,支持 HTML 格式 |
| 图标 | QChart* chart () | 返回序列所属的图表对象 |
| 序列外观 | void setVisible () | 设置序列可见性 |
| | void show () | 显示序列,可见 |
| | void hide () | 隐藏序列,不可见 |
| | void setColor () | 设置序列的线条颜色 |
| | void setPen () | 设置绘制线条的笔画 |
| | void setBrush () | 设置绘制数据点的画刷 |
| | void setOpacity () | 设置序列的透明度,0 表示完全透明,1 表示不透明 |
| 数据点 | void setPointsVisible () | 设置数据点可见性 |
| | void append () | 添加一个数据点到序列 |
| | void insert () | 在某个位置插入数据点 |
| | void replace () | 替换某个数据点 |
| | void clear () | 清除所有数据点 |
| | void remove () | 删除某个数据点 |
| | void removePoints () | 从某个位置开始,删除指定数量的数据点 |
| | int count () | 数据点个数 |
| 数据点 | QPointF& at () | 返回某个位置的数据点 |
| | QList points () | 返回数据点列表 |
| | QVector pointsVector () | 返回数据点的向量,效率高 |
| 数据点标签 | void setPointLabelsVisible () | 设置数据点标签可见性 |
| | void setPointLabelsColor () | 设置数据点标签颜色 |
| | void setPointLabelsFont () | 设置数据点标签的字体 |
| | void setPointLabelsFormat () | 设置数据点标签的格式 |
| | void setPointLabelsClipping () | 设置标签的裁剪属性,缺省为 True,即绘图区外的标签被裁剪 |
| 坐标轴 | bool attachAxis () | 为序列附加一个坐标轴 |
| | bool detachAxis () | 接触一个附加的坐标轴 |
| | QListattachedAxes () | 返回附加的坐标轴列表 |
| 在我们的 demo 中队曲线序列进行属性设置的界面选择操作的 RedioButton 按钮选择操作序列,两个代码相同: | | |

void MainWindow::on_radioSeries0_clicked()

{
    if (ui->radioSeries0->isChecked()) {
        curSeries = (QLineSeries*)ui->chartView->chart()->series().at(0);
    }
    else {
        curSeries = (QLineSeries*)ui->chartView->chart()->series().at(1);

    }
    ui->editSeriesName->setText(curSeries->name()); // 序列名称
    ui->chkSeriesVisible->setChecked(curSeries->isVisible()); // 序列可见性
    ui->chkPointVisible->setChecked(curSeries->pointsVisible()); // 数据点可见性
    ui->sliderSeriesOpacity->setValue(curSeries->opacity() * 10); // 透明度
    ui->chkPointLableVisible->setChecked(curSeries->pointLabelsVisible()); // 数据点标签可见性

}

curSeries 是在 MainWindow 类里定义的私有变量,用于指向当前操作的序列。选择序列后,会将当前序列的一些属性显示到界面上,如序列名称、序列可见性、序列数据点可见性等。
数据点标签的格式设置使用函数 setPointLabelsFormat() ,有两种数据库在数据点标签重显示,有固定标签:

  • @xPoint,数据点的 X 值;
  • @yPoint,数据点的 Y 值。
    例如,使数据点标签只显示 Y 值,设置语句为:
curSeries->setPointLabelsFormat("@xPoint")

如果使数据点标签显示 (X,Y) 的值,设置语句为:

curSeries->setPointLabelsFormat("@xPoint,@yPoint")

为一个序列添加数据点,可以使用 append() 函数们也可以使用流操作符 <<,如 prepareData() 函数中添加一个数据点的不封可以改写为:

*series0 << QPointF(t, y1); // 序列添加数据点

为序列指定坐标轴,前面在 createChart() 函数中,使用 QChart 的函数为序列设置坐标轴:

chart->addAxis(axisX, Qt::AlignBottom);
chart->addAxis(axisY, Qt::AlignRight);
series0->attachAxis(axisX);
series0->attachAxis(axisY);
series1->attachAxis(axisX);
series1->attachAxis(axisY);

addAxis() 添加坐标轴到图表中,并且指定了方向。attachAxis() 函数为序列附加坐标轴。(需要注意的是,这是 Qt 5.12.1 之后的写法)

QValueAxis 坐标轴的设置

在这个 demo 中,我们使用 QValeAxis 类的坐标轴,也就是数值类型坐标轴,与 QLineSeries 正好配合使用。Qt 提供了好几种坐标轴类都是从 QAbstractAxis 类继承而来,这个我们前面说过了。QValueAxis 类的主要函数如下:(缺省了输入参数)

| 分组 | 函数 | 功能描述 |
| — | — | — |
| 坐标轴整体 | void setVisible () | 设置坐标轴可见性 |
| | Qt:: Orientation orientation () | 返回坐标轴方向 |
| | void setMin () | 设置坐标轴最小值 |
| | void setMax () | 设置坐标轴最大值 |
| | void setRange () | 设置坐标轴范围 |
| 轴标题 | void setTitleVisible () | 设置标题可见性 |
| | void setTitleTest () | 设置标题文字 |
| | void setTitleFont () | 设置标题字体 |
| | void setTitleBrush () | 设置标题画刷 |
| 轴标签 | void setLabelFormat () | 设置轴标签格式 |
| | void setLabelsAngle () | 设置标签的角度(度) |
| | void setLabelsBrush () | 设置轴标签画刷 |
| | void setLabelsColor () | 设置轴标签颜色 |
| | void setLabelsFont () | 这种轴标签字体 |
| | void setLabelsVisible () | 设置轴标签文字是否可见 |
| 轴线和刻度线 | void setTickCount () | 设置坐标轴主刻度的个数 |
| | void setLineVisible () | 设置轴线和刻度线的可见性 |
| | void setLinePen () | 设置轴线和刻度线的画笔 |
| | void setLinePenColor () | 设置轴线和刻度线的颜色 |
| 主网格线 | void setGridLineColor () | 设置网格线的颜色 |
| | void setFridLinePen () | 设置网格线的画笔 |
| | void setGridLineVisible () | 设置网格线的可见性 |
| 次刻度和次网格线 | void setMinorTickCount () | 设置两个主刻度之间的次刻度的个数 |
| | void setMinorGridLineColor () | 设置次网格线的颜色 |
| | void setMinorGridLinePen () | 设置次网格线的画笔 |
| | void setMinorGridLineVisible () | 设置次网格线的可见性 |

QValueAxis 坐标轴有以下几个组成部分:

  • 坐标轴标题:坐标轴下方显示的文字,表示坐标轴名称,可以设置内容、字体、画刷和可见性。
  • 轴线和刻度线:轴线是从左到右表示轴的直线,刻度线是垂直于垂直于轴线的短线,包括主刻度线和次刻度线,主刻格式是 tickCount(),每两个主刻度之间的次刻度的个数是 minorTickCount()
  • 轴标签:在主刻度处显示数值标签文字,可以控制其数值格式、文字颜色和字体等。
  • 主网格线:在绘图区与主刻度相对应的网格线,可以设置颜色、线条的 Pen 属性和可见性等。
  • 次网格线:在绘图区与次刻度相对应的网格线,可以设置颜色、线条的 Pen 属性和可见性等。

坐标轴设置界面的 UI 如下:

在界面上我们可以选择需要操作的坐标轴的对象,两个 RadioButton 按钮的响应代码相同。为 radioX 按钮编写事件槽函数,另一个按钮的槽函数里只要调用这个槽函数即可,代码如下:

void MainWindow::on_radioX_clicked()
{
    QList<QAbstractAxis*> axes;
    if (ui->radioX->isChecked()) {
        axes = ui->chartView->chart()->axes(Qt::Horizontal);
    }
    else {
        axes = ui->chartView->chart()->axes(Qt::Vertical);
    }

    curAxis = (QValueAxis*)axes[0];

    ui->spinAxisMin->setValue(curAxis->min());
    ui->spinAxisMax->setValue(curAxis->max());

    ui->editAxisTitle->setText(curAxis->titleText());
    ui->chkBoxAxisTitle->setChecked(curAxis->isTitleVisible());

    ui->editAxisLabelFormat->setText(curAxis->labelFormat());
    ui->chkBoxLabelsVisible->setChecked(curAxis->labelsVisible());

    ui->chkGridLineVisible->setChecked(curAxis->isGridLineVisible());
    ui->chkAxisLineVisible->setChecked(curAxis->isLineVisible());

    ui->spinMinorTickCount->setValue(curAxis->minorTickCount());
    ui->chkMinorTickVisible->setChecked(curAxis->isMinorGridLineVisible());
}

void MainWindow::on_radioY_clicked()
{
    on_radioX_clicked();
}

程序中 curAxis 是在 MainWindow 类中定义的私有变量,用于表示当前操作的坐标轴对象。获取对象后,首先获得轴对象的各种属性并显示在界面上。
在编辑框 editAxisLabelFormat 里设置格式字符串,例如“%. 2 f”,作为 QValueAxis::setLableFormat() 的输入参数。格式字符串的定义与 printf() 函数的格式字符串定义一样。