我已经在 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);
}
}
}
如何使用抓取窗口指定需要抓取哪个窗口
您的代码可以工作,但是您覆盖了已经存在的文件。 在下面的行中,您设置一个静态文件
Report.pdf
,这样打印机将始终打印到此文件并覆盖它。
printer.setOutputFileName(path+"/Report.pdf");
我建议您使用
winid
来指定要打印的窗口。
您可以通过将上面的行更改为以下内容来实现此目的:
printer.setOutputFileName(path + "/" + winid.toStdString() + "_Report.pdf");
这将为您尝试打印的每个窗口提供一个文件。