QAbstractBarSeries 类
QAbstractBarSeries 是 Qt 图表模块中所有柱状图系列类的抽象父类。它用于定义柱状图的基本行为和属性,如柱宽、标签位置、数据管理等。
核心功能与特点
-
支持多种柱状图系列:
- 继承类包括:
QBarSeries
、QStackedBarSeries
、QPercentBarSeries
、QHorizontalBarSeries
等。 - 每种系列类型提供不同的柱状图表现形式。
- 继承类包括:
-
数据管理:
- 通过
QBarSet
类管理单个柱数据。 - 支持动态添加、删除、清空和插入数据集。
- 通过
-
柱状图样式设置:
- 控制柱宽(
barWidth
)、标签显示(labelsVisible
)、标签格式(labelsFormat
)、标签位置(labelsPosition
)等。
- 控制柱宽(
-
交互支持:
- 提供点击、双击、鼠标悬停等交互信号。
主要属性
柱宽(barWidth)
- 描述: 设置柱的宽度,单位为 x 轴的单位。
- 默认值: 通常根据坐标轴的缩放自动调整。
- 访问方法:
- 获取:
qreal barWidth() const
- 设置:
void setBarWidth(qreal width)
- 获取:
柱数量(count)
- 描述: 当前系列中
QBarSet
的数量。 - 访问方法:
- 获取:
int count() const
- 获取:
标签属性
-
标签显示(labelsVisible):
- 控制是否显示柱的值标签。
- 获取:
bool isLabelsVisible() const
- 设置:
void setLabelsVisible(bool visible = true)
-
标签格式(labelsFormat):
- 控制标签显示格式,可用
@value
占位符表示柱值。 - 示例:
series->setLabelsFormat("@value%");
- 获取:
QString labelsFormat() const
- 设置:
void setLabelsFormat(const QString &format)
- 控制标签显示格式,可用
-
标签角度(labelsAngle):
- 设置标签的显示角度(单位:度)。
- 获取:
qreal labelsAngle() const
- 设置:
void setLabelsAngle(qreal angle)
-
标签位置(labelsPosition):
- 设置标签在柱中的位置,枚举值:
LabelsCenter
: 标签居中。LabelsInsideEnd
: 标签位于柱顶部内侧。LabelsInsideBase
: 标签位于柱底部内侧。LabelsOutsideEnd
: 标签位于柱顶部外侧。
- 获取:
LabelsPosition labelsPosition() const
- 设置:
void setLabelsPosition(QAbstractBarSeries::LabelsPosition position)
- 设置标签在柱中的位置,枚举值:
-
标签精度(labelsPrecision):
- 设置标签显示的数字精度。
- 获取:
int labelsPrecision() const
- 设置:
void setLabelsPrecision(int precision)
主要成员函数
数据管理
-
添加数据:
bool append(QBarSet *set)
添加单个QBarSet
数据集到系列中。bool append(const QList<QBarSet *> &sets)
批量添加多个数据集。
-
删除数据:
bool remove(QBarSet *set)
删除指定的数据集并释放其内存。void clear()
删除所有数据集并释放内存。
-
插入与提取:
bool insert(int index, QBarSet *set)
在指定位置插入数据集。bool take(QBarSet *set)
从系列中移除指定数据集但不释放其内存。
获取与设置属性
-
获取数据集列表:
QList<QBarSet *> barSets() const
返回当前系列中的所有数据集列表。
-
设置与获取柱宽:
void setBarWidth(qreal width)
qreal barWidth() const
交互信号
鼠标事件
void clicked(int index, QBarSet *barset)
用户单击柱时发出信号。void doubleClicked(int index, QBarSet *barset)
用户双击柱时发出信号。void hovered(bool status, int index, QBarSet *barset)
用户悬停在柱上时发出信号。
数据变化
void barsetsAdded(const QList<QBarSet *> &sets)
数据集被添加时发出信号。void barsetsRemoved(const QList<QBarSet *> &sets)
数据集被移除时发出信号。void countChanged()
数据集数量变化时发出信号。
标签变化
void labelsVisibleChanged()
标签显示状态变化时发出信号。void labelsAngleChanged(qreal angle)
标签角度变化时发出信号。void labelsFormatChanged(const QString &format)
标签格式变化时发出信号。void labelsPositionChanged(QAbstractBarSeries::LabelsPosition position)
标签位置变化时发出信号。
使用示例
创建一个简单的柱状图
#include <QtCharts>
#include <QApplication>
#include <QMainWindow>
using namespace QtCharts;
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
// 创建数据集
QBarSet *set0 = new QBarSet("Product A");
QBarSet *set1 = new QBarSet("Product B");
// 添加数据
*set0 << 10 << 20 << 30 << 40;
*set1 << 15 << 25 << 35 << 45;
// 创建柱状图系列
QBarSeries *series = new QBarSeries();
series->append(set0);
series->append(set1);
// 设置标签
series->setLabelsVisible(true);
series->setLabelsFormat("@value units");
series->setLabelsPosition(QAbstractBarSeries::LabelsOutsideEnd);
// 创建图表
QChart *chart = new QChart();
chart->addSeries(series);
chart->setTitle("Sales Data");
chart->setAnimationOptions(QChart::SeriesAnimations);
// 设置轴
QStringList categories = {"Q1", "Q2", "Q3", "Q4"};
QBarCategoryAxis *axisX = new QBarCategoryAxis();
axisX->append(categories);
chart->addAxis(axisX, Qt::AlignBottom);
series->attachAxis(axisX);
QValueAxis *axisY = new QValueAxis();
axisY->setRange(0, 50);
chart->addAxis(axisY, Qt::AlignLeft);
series->attachAxis(axisY);
// 创建图表视图
QChartView *chartView = new QChartView(chart);
chartView->setRenderHint(QPainter::Antialiasing);
// 显示主窗口
QMainWindow window;
window.setCentralWidget(chartView);
window.resize(800, 600);
window.show();
return app.exec();
}
总结
QAbstractBarSeries 是柱状图系列的基础类,为管理柱状图数据、样式和交互提供了强大的功能。通过其派生类(如 QBarSeries
和 QStackedBarSeries
),可以轻松实现各种形式的柱状图,并通过丰富的信号和属性实现动态更新和用户交互功能。