我使用Qt charts模块直接在PDF文件上绘制饼形图。
这里有个问题,:
show()显示图表,然后将其呈现给PDF,使其大小为OK (左图像)。show()的窗口中,那么绘图在PDF (右图像)中会变得太小,即使图表的大小是用resize()正确设置的。


(将黑色边框添加到这些图像中以提高可视化程度)
在将图表呈现到PDF之前,在窗口上显示所有图表不是一个选项。图表需要执行show() for QPainter才能正确地将其绘制到PDF,这一事实似乎表明,如果没有它,QPainter就会忽略图表的维度。
另外,show()会打开窗口,但需要几秒钟时间才能显示图表,所以渲染非常慢,这也是我不想显示图表的另一个原因。
以下是我的主要问题:
这是一个最小、完整和可验证的示例..。
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发布于 2014-12-19 22:54:52
绕过此问题的一种方法是从QPixmap中创建QChartView并将像素映射绘制到PDF中:
QPixmap pix = chartView->grab();
int h = painter.window().height()*0.4;
int w = h * 1.3;
int x = (painter.window().width() / 2) - (w/2);
int y = (painter.window().height() / 2) - (h/2);
chartView->resize(w, h);
painter.drawPixmap(x, y, w, h, pix);--这有点像获取小部件的屏幕快照,并将其呈现到文件中。
QPainter.drawPixmap(),让我们在PDF中指定绘图的大小和位置。这并不理想,但暂时还可以。我知道,这是个黑客,有效,但我仍在寻找更好的解决方案。
发布于 2015-06-24 09:26:15
我认为这可能是一个缩放问题,因为我遇到了一个类似的问题,我的输出比预期的要小得多。QPdfWriter有一个“点”的逻辑单位,默认分辨率是每英寸1200点。您需要决定如何在QChartView大小和打印外观之间进行映射。默认情况下,QPdfWriter会将一个像素映射到一个点。您想要设置1200/pixelsPerInch的缩放
有关示例代码,请参见这里的另一个答案:QTextDocument,QPdfWriter -如何缩放输出
发布于 2021-10-26 20:36:46
我发现抓取像素地图并不好,因为它看起来可能不太好或者分辨率很好。但是,您可以这样做:
图表视图->抓取();chartView->呈现(&画家,.等。
其中chartView是一个QChartView对象。然后画家正确地渲染图表。它的工作原理和show()一样好,但是您不必在GUI中显示图表。显然,grab()和show()都会导致图表在内部呈现,并以某种方式绕过Qt错误。
https://stackoverflow.com/questions/27530390
复制相似问题