gpt4 book ai didi

c++ - Qt 图表在 PDF 上呈现问题

转载 作者:可可西里 更新时间:2023-11-01 15:20:03 24 4
gpt4 key购买 nike

我正在使用 Qt charts 模块绘制 pie chart直接在PDF文件上。

这是问题所在:

  • 由于某些未知原因,图表需要在呈现为 PDF 之前用 show() 显示,因为它的大小合适(左图)。

  • 另一方面,我不想在屏幕上显示每个图表,因为我的应用程序会生成很 multimap 表。 但是,如果图表未显示在带有 show() 的窗口中,则绘图在 PDF 中变得太小(右图),即使图表的大小使用 resize() 正确设置。

(在这些图像中添加了黑色边框以提高可视化效果)

在将所有图表呈现为 PDF 之前在窗口中显示所有图表不是一种选择。图表需要执行 show() 以便 QPainter 将其正确绘制到 PDF 的事实似乎表明,如果没有它,QPainter 将忽略图表的维度。

旁注,show() 打开窗口,但需要几秒钟的时间图表出现,所以渲染非常非常慢,这是我不想显示图表的另一个原因。

所以这是我的主要问题:

  • 这些是错误还是我遗漏了什么?
  • 如果不是,指定绘图大小和 (x,y) 位置的正确方法是什么(在PDF)?

这是一个Minimal, Complete, and Verifiable example ...

ma​​in.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

最佳答案

绕过这个问题的一种方法是从 QChartView 创建一个 QPixmap 并将像素图绘制到 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 中绘图的大小和位置。这并不理想,但现在可以了。我知道,这是一个 hack,它有效,但我仍在寻找更好的解决方案。

关于c++ - Qt 图表在 PDF 上呈现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27530390/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com