如何将 qml ui 保存为 pdf

问题描述 投票:0回答:1

我已经在 qml 中创建了一个 ui,现在我想将该 ui 保存为 pdf。我尝试使用 GrabWidow 但在我的 qml 中我使用了 2 个以上的应用程序窗口。抓取窗口以我的主 qml 作为屏幕截图,但我想获取第二个应用程序窗口。

void PdfExporter::screenShot(QString path, QString winid)
{

    foreach(QObject* obj, mEngine->rootObjects()) 
    {
        QQuickWindow* window = qobject_cast<QQuickWindow*>(obj);
        qDebug()<<"window Name:" << winid;
        if (window)
        {
            window->renderTargetId();
            QImage image = window->grabWindow();

            QPrinter printer;
            printer.setOutputFormat(QPrinter::PdfFormat);
            printer.setOutputFileName(path+"/Report.pdf");

            QPainter painter(&printer);
            printer.setOutputFormat(QPrinter::PdfFormat);
            QRect rect=painter.viewport();
            QSize size=image.size();

            size.scale(rect.size(), Qt::KeepAspectRatio);
            painter.setViewport(rect.x(), rect.y(), size.width(), size.height());
            painter.setWindow(image.rect());

            //painter.drawImage(0,0,100,100,image);
            painter.drawImage(QRect(0, 0, image.width(), image.height()), image);

             //painter.begin(&printer);

        }
    }
}

如何使用抓取窗口指定需要抓取哪个窗口

c++ qt qml qt5
1个回答
0
投票

您的代码可以工作,但是您覆盖了已经存在的文件。 在下面的行中,您设置一个静态文件

Report.pdf
,这样打印机将始终打印到此文件并覆盖它。

printer.setOutputFileName(path+"/Report.pdf");

我建议您使用

winid
来指定要打印的窗口。 您可以通过将上面的行更改为以下内容来实现此目的:

printer.setOutputFileName(path + "/"  + winid.toStdString() + "_Report.pdf");

这将为您尝试打印的每个窗口提供一个文件。

© www.soinside.com 2019 - 2024. All rights reserved.