一、QCPBars 概述
QCPBars 是 QCustomPlot 中用于绘制柱状图/条形图的类,支持单组或多组柱状图显示,可自定义宽度、颜色和间距等属性。
二、主要属性
属性 | 类型 | 描述 |
---|---|---|
width |
double |
柱子的宽度(坐标轴单位) |
widthType |
WidthType |
宽度计算方式(坐标单位或像素单位) |
barsGroup |
QCPBarsGroup* |
所属的柱状图分组 |
pen |
QPen |
柱子边框的画笔属性 |
brush |
QBrush |
柱子填充的画刷属性 |
name |
QString |
柱状图名称(显示在图例中) |
visible |
bool |
是否可见 |
selectable |
bool |
是否可选择 |
selected |
bool |
当前是否被选中 |
三、常用方法
1. 数据相关方法
方法 | 参数 | 返回值 | 描述 |
---|---|---|---|
setData |
const QVector<double>& keys, const QVector<double>& values |
void | 设置柱状图数据 |
setData |
QSharedPointer<QCPBarsDataContainer> data |
void | 设置数据容器 |
addData |
const QVector<double>& keys, const QVector<double>& values |
void | 追加数据 |
addData |
double key, double value |
void | 添加单个柱子 |
dataCount |
- | int | 返回柱子数量 |
data |
- | QSharedPointer<QCPBarsDataContainer> |
获取数据容器 |
2. 样式设置方法
方法 | 参数 | 返回值 | 描述 |
---|---|---|---|
setWidth |
double width |
void | 设置柱子宽度 |
setWidthType |
WidthType widthType |
void | 设置宽度计算方式 |
setPen |
const QPen &pen |
void | 设置边框画笔 |
setBrush |
const QBrush &brush |
void | 设置填充画刷 |
setSelectedPen |
const QPen &pen |
void | 设置选中状态边框画笔 |
setSelectedBrush |
const QBrush &brush |
void | 设置选中状态填充画刷 |
setBarsGroup |
QCPBarsGroup *barsGroup |
void | 设置柱状图分组 |
3. 交互相关方法
方法 | 参数 | 返回值 | 描述 |
---|---|---|---|
setSelectable |
QCP::SelectionType selectable |
void | 设置可选择类型 |
setSelection |
QCPDataSelection selection |
void | 设置选中柱子 |
selected |
- | QCPDataSelection |
获取选中柱子 |
selectTest |
const QPointF &pos, bool onlySelectable, QVariant *details |
double | 测试点是否选中柱子 |
四、信号列表
信号 | 参数 | 描述 |
---|---|---|
selectionChanged |
bool selected |
选中状态改变时触发 |
selectableChanged |
QCP::SelectionType selectable |
可选择状态改变时触发 |
五、枚举类型
1. WidthType 宽度类型
值 | 描述 |
---|---|
wtAbsolute |
绝对宽度(坐标轴单位) |
wtAxisRectRatio |
相对于轴矩形宽度的比例 |
wtPlotCoords |
使用绘图坐标计算宽度 |
六、基础使用示例
cpp
// 创建柱状图
QCPBars *bars = new QCPBars(customPlot->xAxis, customPlot->yAxis);
// 设置数据
QVector<double> x(5), y(5);
for (int i=0; i<5; ++i) {
x[i] = i+1; // 1, 2, 3, 4, 5
y[i] = QRandomGenerator::global()->bounded(1, 10); // 随机值1-10
}
bars->setData(x, y);
// 设置样式
bars->setName("月度销售额");
bars->setWidth(0.5); // 柱子宽度
bars->setPen(QPen(Qt::darkBlue));
bars->setBrush(QColor(100, 150, 250));
// 设置坐标轴
customPlot->xAxis->setRange(0, 6);
customPlot->yAxis->setRange(0, 10);
// 刷新显示
customPlot->replot();
七、高级功能示例
1. 多组柱状图
cpp
// 创建第一组柱状图
QCPBars *bars1 = new QCPBars(customPlot->xAxis, customPlot->yAxis);
bars1->setData({1,2,3,4}, {3,5,2,6});
bars1->setWidth(0.3);
bars1->setBrush(QColor(100, 150, 250));
bars1->setName("第一季度");
// 创建第二组柱状图
QCPBars *bars2 = new QCPBars(customPlot->xAxis, customPlot->yAxis);
bars2->setData({1,2,3,4}, {4,3,6,2});
bars2->setWidth(0.3);
bars2->setBrush(QColor(250, 150, 100));
bars2->setName("第二季度");
// 创建柱状图分组并设置间距
QCPBarsGroup *group = new QCPBarsGroup(customPlot);
group->setSpacingType(QCPBarsGroup::stAbsolute);
group->setSpacing(0.1); // 柱子间距
group->append(bars1);
group->append(bars2);
2. 堆叠柱状图
cpp
// 创建基础柱状图
QCPBars *baseBars = new QCPBars(customPlot->xAxis, customPlot->yAxis);
baseBars->setData({1,2,3,4}, {3,2,4,1});
baseBars->setBrush(QColor(100, 150, 250));
// 创建堆叠在上方的柱状图
QCPBars *stackedBars = new QCPBars(customPlot->xAxis, customPlot->yAxis);
stackedBars->setData({1,2,3,4}, {2,3,1,4});
stackedBars->setBrush(QColor(250, 150, 100));
stackedBars->moveAbove(baseBars); // 关键:设置堆叠顺序
3. 自定义柱子选择样式
cpp
bars->setSelectable(QCP::stSingleData); // 允许选择单个柱子
bars->setSelectedPen(QPen(Qt::red, 2));
bars->setSelectedBrush(QBrush(QColor(255, 100, 100, 150)));
// 连接选择变化信号
connect(customPlot, &QCustomPlot::selectionChangedByUser, [=](){
if (bars->selected()) {
QCPDataSelection selection = bars->selection();
if (selection.dataRangeCount() > 0) {
int index = selection.dataRange().begin();
qDebug() << "选中了第" << index+1 << "个柱子";
}
}
});
八、性能优化技巧
大数据集处理:
cpp
bars->setAntialiased(false); // 关闭抗锯齿提高性能
自定义绘制:
cpp
// 继承QCPBars重写draw方法实现自定义绘制 class CustomBars : public QCPBars { protected: virtual void draw(QCPPainter *painter) override { // 自定义绘制逻辑 } };
使用OpenGL加速:
cpp
customPlot->setOpenGl(true);
QCPBars 提供了丰富的自定义选项,可以创建各种复杂的柱状图可视化效果,包括分组柱状图、堆叠柱状图、百分比柱状图等。