C/C++ QChart如何自定义显示柱状图每根柱子的数值,请给出详细代码
时间: 2024-10-10 18:02:08 浏览: 23
在QCharts中,要自定义显示柱状图(Bar Chart)的每根柱子的数值,你可以通过创建一个`QChartItemDelegate`来实现。这个委托会在绘制每个条形时处理额外的内容,如文本标签。以下是一个简单的例子:
```cpp
#include <QApplication>
#include <QChart>
#include <QChartView>
#include <QColumnDataSource>
#include <QDate>
#include <QDateTime>
#include <QFontMetricsF>
#include <QPen>
#include <QTextItem>
#include <QValueAxis>
class CustomBarDelegate : public QAbstractItemDelegate
{
public:
CustomBarDelegate(QObject *parent = nullptr)
: QAbstractItemDelegate(parent) {}
protected:
void paint(QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index) const override {
QChartItem *item = static_cast<QChartItem *>(index.internalPointer());
if (item->type() == QChart::BarSeries) {
auto bar = qobject_cast<const QBarSeries *>(item)->bar(index.row());
// 绘制柱子
painter->save();
painter->setRenderHint(QPainter::Antialiasing);
item->draw(painter, option);
// 获取字体大小和坐标
QFontMetricsF metrics(option.font);
QRectF textRect = painter->viewport()->rect().translated(option.rect.topLeft());
textRect.setWidth(bar.width());
textRect.setHeight(metrics.height() + 5); // 可调整文字上下间距
// 文本内容
QString text = qvalueToKey(bar.value()); // 假设qvalueToKey函数将值转换成字符串
QTextItem *textItem = new QTextItem(text, painter, textRect);
// 设置颜色和对齐
textItem->setFont(option.font);
textItem->setPen(Qt::black);
textItem->setAlignment(Qt::AlignCenter);
painter->restore();
}
QAbstractItemDelegate::paint(painter, option, index);
}
private:
QPen m_pen;
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// 创建数据源
QDate startDate(2023, 1, 1);
QDate endDate(2023, 12, 31);
QVector<int> data = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100}; // 柱状图的数据
QVector<QDateTime> dates = QDateTime::from日期(startDate.addDays(i), Qt::UTC).toLocalTime()
for (int i = 0; i < data.size(); ++i);
QColumnDataSource dataSource(dates, 0, data, 0, "Date", "Value");
// 创建图表
QChart chart("Custom Bar Chart");
chart.setAnimationOptions(QChart::NoAnimation);
chart.setTitle(QStringLiteral("Custom Bar Chart with Values"));
// 添加轴
QValueAxis *axisX = new QValueAxis();
axisX->setTitle(QStringLiteral("Date"));
chart.addAxis(axisX, Qt::AlignBottom);
chart.createDefaultAxes();
// 添加系列
QBarSeries *series = new QBarSeries();
series->append(dates, data);
chart.addSeries(series);
// 自定义代理
CustomBarDelegate delegate;
chart.setItemDelegate(&delegate);
// 视图
QChartView view(&chart);
view.setRenderHint(QPainter::Antialiasing);
// 显示图表
QWidget window;
QVBoxLayout *layout = new QVBoxLayout(&window);
layout->addWidget(&view);
window.show();
return app.exec();
}
//
阅读全文