我正在将一些Qt(C++和QML)代码从Qt4.8升级到Qt5.1.
Qt4.8代码是一个简单的C++"QML查看器"应用程序子类化a QDeclarativeView和一堆QML.
QQuickView除了一件事之外,很容易将其更改为使用Qt5/QtQuick2 :
Qt4.8应用程序有一个打印到PDF的方法:
void MyQMLViewer::printToPDF(const QString& filename) const {
QPrinter printer(QPrinter::HighResolution);
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setPageSize(QPrinter::A3);
printer.setOutputFileName(filename);
printer.setOrientation(QPrinter::Landscape);
QPainter painter(&printer);
render(&painter);
}
Run Code Online (Sandbox Code Playgroud)
Qt5.1需要进行一些"环境"更改才能获得QPrinter(即添加QT += printsupport到项目.pro文件中#include <QtPrintSupport>),但似乎有一个更基本的问题,QQuickView它不提供任何明显与QGraphicsView/ 兼容的东西.QPainter/ QPaintDeviceworld of QPrinter(具体来说,QQuickView没有render方法,所有绘图/绘画/渲染相关的方法看起来与OpenGL非常相关).
有关如何从中获得高质量PDF输出的任何建议QQuickView?
(请注意,我not只是希望截图的视图;与QDeclarativeView上面的代码生成的PDF文件与很多更好的分辨率甚至超过了应用程序全屏我最大的显示器上).
我看到"将QML应用程序移植到Qt 5"指南中的"QDeclarativeItem和QDeclarativeView"部分确实提到了QGraphicsView特定功能的丢失,但没有提供任何解决方案(尽管它确实提到了带有自定义项目的工作场所QPainter-基础渲染被买入新政权).
更新一些额外的背景信息:可以在此处找到使用上述代码从QDeclarativeView打印的PDF示例.有一个体面的大小监视器上相同的观点的PNG 这里.(这实际上是一系列幻灯片中的最后一张幻灯片;它实际上是以前幻灯片的一个画廊,它将每张幻灯片反弹到屏幕上;如果我有时间,我会考虑画廊的可行性是唯一的改变每个分散的幻灯片进入Prezi风格的演示视图;怀疑QDeclarative虽然不够真实,这是想要进入QtQuick2 + Qt5.2的新场景图形的一个原因).无论如何,如果你将PDF缩放到100%,你会看到文本是...好吧,它比任何一个大小合适的图像文件管理我认为,尽管倾斜的文本基线可能看起来有点不均匀.还有一个问题,不透明度值没有在PDF中表示(因此阴影和"气泡"变得坚固); …
我正在尝试使用QWebview在打印机上打印图像文件,但不打印图像空白页.请找到以下代码.
void ChartViewer::onprintBtnClicked()
{
QString fileName = QFileDialog::getOpenFileName(this,"Open File",QString(),"Pdf File(*.png)");
qDebug()<<"Print file name is "<<fileName;
if(fileName.endsWith(".png"))
{
QPrinter printer;
QWebView *view = new QWebView;
QPrintDialog *dlg = new QPrintDialog(&printer,this);
printer.setOutputFileName(fileName);
if(dlg->exec() != QDialog::Accepted)
return;
view->load(fileName);
view->print(&printer);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我使用view-> show(),那么它已正确显示图像,但打印页面空白.请你查看上面的代码并纠正我在哪里做错了.
此致Lekhraj