【发布时间】:2014-12-17 16:36:40
【问题描述】:
我正在使用 Qt charts 模块直接在 PDF 文件上绘制 pie chart。
问题出在这里:
由于某种未知原因,图表需要在呈现为 PDF 之前显示为
show()以使其大小正常(左图)。另一方面,我不想在屏幕上显示每个图表,因为我的应用程序会生成很多图表。 但是,如果图表没有显示在带有
show()的窗口中,那么即使使用resize()正确设置了图表的大小,PDF 中的绘图也会变得太小(右图) .
(为这些图像添加了黑色边框以提高可视化效果)
在呈现为 PDF 之前在窗口上显示所有图表不是一种选择。图表需要执行show() 以使 QPainter 正确地将其绘制到 PDF 的事实似乎表明没有它,QPainter 会忽略图表的维度。
附带说明,show() 打开窗口,但需要几秒钟
图表要出现,所以渲染非常非常慢,这是我不想显示图表的另一个原因。
以下是我的主要问题:
- 是这些错误还是我遗漏了什么?
- 如果不是,那么指定绘图的大小和 (x,y) 位置的正确方法是什么(在 PDF)?
这是Minimal, Complete, and Verifiable example...
main.cpp:
#include <QApplication>
#include <QtCharts/QChartView>
#include <QtCharts/QPieSeries>
#include <QtCharts/QPieSlice>
#include <QPainter>
#include <QPdfWriter>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QtCharts::QChartView* chartView = new QtCharts::QChartView();
chartView->setRenderHint(QPainter::Antialiasing);
chartView->resize(640, 480);
QtCharts::QChart* chart = chartView->chart();
chart->setTitle("Beautiful Pie Chart");
chart->legend()->hide();
QtCharts::QPieSeries* series = new QtCharts::QPieSeries();
float hits = 73.0f, misses = 27.0f;
series->append("Hits", hits);
series->append("Misses", misses);
QtCharts::QPieSlice* hit_slice = series->slices().at(0);
hit_slice->setBrush(QColor(87, 147, 243)); // blue
QtCharts::QPieSlice* miss_slice = series->slices().at(1);
miss_slice->setBrush(QColor(221, 68, 68)); // red
chart->addSeries(series);
// Due to Qt bug, must show() the chart before render()
// or it will be draw too tiny in the PDF by QPainter
chartView->show();
QPdfWriter writer("out.pdf");
writer.setCreator("https://stackoverflow.com/users/176769/karlphillip");
writer.setPageSize(QPagedPaintDevice::A4);
QPainter painter(&writer);
chartView->render(&painter);
painter.end();
return a.exec();
}
QtCharts_PDF.pro:
QT += core gui charts
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = QtCharts_PDF
TEMPLATE = app
SOURCES += main.cpp
【问题讨论】:
标签: c++ qt pdf charts qpainter