首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PDF上呈现问题的Qt图表

在PDF上呈现问题的Qt图表
EN

Stack Overflow用户
提问于 2014-12-17 16:36:40
回答 3查看 5.2K关注 0票数 12

我使用Qt charts模块直接在PDF文件上绘制饼形图

这里有个问题,

  • 由于一些未知的原因,需要用show()显示图表,然后将其呈现给PDF,使其大小为OK (左图像)。
  • 另一方面,我不想在屏幕上显示每个图表,因为我的应用程序生成了很多图表。但是,如果图表没有显示在带有show()的窗口中,那么绘图在PDF (右图像)中会变得太小,即使图表的大小是用resize()正确设置的。

(将黑色边框添加到这些图像中以提高可视化程度)

在将图表呈现到PDF之前,在窗口上显示所有图表不是一个选项。图表需要执行show() for QPainter才能正确地将其绘制到PDF,这一事实似乎表明,如果没有它,QPainter就会忽略图表的维度。

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

以下是我的主要问题:

  • 这些是虫子还是我漏掉了什么?
  • 如果没有,那么指定绘图的大小和(x,y)位置(在PDF中)的正确方法是什么?

这是一个最小、完整和可验证的示例..。

main.cpp

代码语言:javascript
复制
#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

代码语言:javascript
复制
QT       += core gui charts

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = QtCharts_PDF
TEMPLATE = app
SOURCES += main.cpp
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-19 22:54:52

绕过此问题的一种方法是从QPixmap中创建QChartView并将像素映射绘制到PDF中:

代码语言:javascript
复制
    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中指定绘图的大小和位置。这并不理想,但暂时还可以。我知道,这是个黑客,有效,但我仍在寻找更好的解决方案。

票数 8
EN

Stack Overflow用户

发布于 2015-06-24 09:26:15

我认为这可能是一个缩放问题,因为我遇到了一个类似的问题,我的输出比预期的要小得多。QPdfWriter有一个“点”的逻辑单位,默认分辨率是每英寸1200点。您需要决定如何在QChartView大小和打印外观之间进行映射。默认情况下,QPdfWriter会将一个像素映射到一个点。您想要设置1200/pixelsPerInch的缩放

有关示例代码,请参见这里的另一个答案:QTextDocument,QPdfWriter -如何缩放输出

票数 2
EN

Stack Overflow用户

发布于 2021-10-26 20:36:46

我发现抓取像素地图并不好,因为它看起来可能不太好或者分辨率很好。但是,您可以这样做:

图表视图->抓取();chartView->呈现(&画家,.等。

其中chartView是一个QChartView对象。然后画家正确地渲染图表。它的工作原理和show()一样好,但是您不必在GUI中显示图表。显然,grab()和show()都会导致图表在内部呈现,并以某种方式绕过Qt错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27530390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档