C/C++ QChart如何自定义显示柱状图每根柱子的数值,在每个数值末尾添加%,目前不存在QChartItem类,请给出详细代码
时间: 2024-10-10 21:12:10 浏览: 29
在C++ Qt中,如果你想要自定义QtCharts库中的QBarSeries,并在每个柱子的末端显示百分比,你需要创建一个自定义系列和绘制样式。由于Qt 5.15以后引入了QChartItem,但在早期版本中并没有直接提供这个功能。以下是一个基本的示例,展示如何手动绘制并添加百分比到每个柱子:
```cpp
#include <QGraphicsScene>
#include <QPainter>
#include <QPen>
#include <QBrush>
#include <QRectF>
#include <QFontMetrics>
#include <QChart>
#include <QBarSet>
#include <QBarCategoryAxis>
#include <QValueAxis>
class CustomBarSeries : public QGraphicsProxyWidget
{
public:
CustomBarSeries(QChart *chart)
: QGraphicsProxyWidget(chart->scene())
{
// 设置一些默认值
m_font = QFont("Arial", 10);
m_pen = QPen(Qt::black, 1);
m_brush = QBrush(Qt::red);
m_percentFormat = QStringLiteral("%.2f%%");
}
void paint(QPainter *painter, const QRectF &rect) override
{
QStyleOptionGraphicsItem option;
initStyleOption(&option);
auto seriesRect = boundingRect();
seriesRect.setWidth(rect.width());
painter->save();
for (int i = 0; i < data().size(); ++i)
{
QRectF barRect(seriesRect.x() + i * (seriesRect.width() / data().size()), seriesRect.y(), seriesRect.width() / data().size(), seriesRect.height());
// 绘制柱子
painter->setPen(m_pen);
painter->setBrush(m_brush);
painter->drawRect(barRect);
// 添加百分比文本
double value = static_cast<double>(data()[i]);
int percent = qRound(value * 100);
QString percentText = formatPercent(percent);
QFontMetrics metrics(m_font);
QRectF textRect = barRect.adjusted(-metrics.horizontalAdvance(percentText), -metrics.ascent(), metrics.horizontalAdvance(percentText), metrics.descent());
painter->setFont(m_font);
painter->fillRect(textRect, QColor(255, 255, 255)); // 如果需要白色背景,这里填充颜色
painter->drawText(textRect, Qt::AlignCenter, percentText);
}
painter->restore();
}
private:
std::vector<int> data() const { return m_data; } // 自定义的数据集合
QString formatPercent(int percent) const { return QFormatSpecifier(m_percentFormat).toString(percent); }
QFont m_font;
QPen m_pen;
QBrush m_brush;
QRegExp m_percentFormat;
std::vector<int> m_data; // 柱状图数据,例如 [10, 20, 30, 40]
};
// 使用示例
QChart *chart = new QChart(...);
CustomBarSeries *barSeries = new CustomBarSeries(chart);
QBarSet *barSet = new QBarSet("Data");
barSeries->setData(barSet, {10, 20, 30, 40}); // 数据填充
chart->addSeries(barSeries);
chart->createDefaultAxes(); // 创建轴
chart->show();
```
这个例子中,我们创建了一个自定义的`CustomBarSeries`,它在`paint`方法中遍历每个柱子并手动绘制。同时计算并添加了百分比文字。请注意,这仅适用于Qt 5之前的版本,对于新版本,可能需要使用QChartItem API或其他更现代的方式。
阅读全文