C++ QWebPage/QPrinter-can';t加载页面
我是新的在Qt,我需要做一个程序谁导出html页面的PDF格式 因此,主要思想是使用C++ QWebPage/QPrinter-can';t加载页面,c++,qt,qwebpage,qprinter,C++,Qt,Qwebpage,Qprinter,我是新的在Qt,我需要做一个程序谁导出html页面的PDF格式 因此,主要思想是使用QWebPage解释html,并使用QPrinter将其自身导出为pdf 我有两个班webview使用QWebPage和Print使用QPrinter 在main.cpp中,我已将LoadFinished连接到PrintPDF插槽: Print *pdf = new Print(args); webview *nav = new webview(); nav->setPrinter(pdf->getP
QWebPage
解释html,并使用QPrinter
将其自身导出为pdf
我有两个班webview
使用QWebPage
和Print
使用QPrinter
在main.cpp
中,我已将LoadFinished
连接到PrintPDF
插槽:
Print *pdf = new Print(args);
webview *nav = new webview();
nav->setPrinter(pdf->getPrinter());
if(nav->load(args) == false) {
qDebug() << "can't load page";
return 0;
}
//when the page page is ready, we will print it
QObject::connect(nav->getFrame(), SIGNAL(loadFinished(bool)), nav, SLOT(printPDF(bool)));
这是我的控制台显示的内容:
不正常QPainter::begin:一个绘画设备一次只能由一名画家绘制 我不知道错误的原因是什么。整个项目是 理由如下:
./htmltopdf http://stackoverflow.com destinationFolder
(destinationFolder尚未实现,您必须直接修改源代码)您的代码中有多个画师。搜索它。 我想问题出在你的“打印机课”上。使用printPDF方法中的本地打印机,它可以工作。试试看:
void webview::printPDF(bool ok)
{
QPrinter printer(QPrinter::HighResolution);
QString fileName = QFileDialog::getSaveFileName(this, "Export PDF",
QString(), "*.pdf");
printer.setPageSize(QPrinter::A4);
printer.setOrientation(QPrinter::Portrait);
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName(fileName);
page()->mainFrame()->print(&printer);
}
更新:这里有一个小的工作示例:
testview.cpp
#包括“testview.h”
#包括
#包括“webview.h”
#包括
#包括
testview::testview(QWidget*父项)
:QMainWindow(父级)
{
ui.setupUi(这个);
QGridLayout*Layout=新的QGridLayout(本);
webview*w=新的webview(此);
w->设置最小尺寸(500500);
centralWidget()->setLayout(布局);
boola=connect(w->page()->mainFrame(),信号(loadFinished(bool)),w,SLOT(printPDF(bool));
w->page()->mainFrame()->加载http://stackoverflow.com"));
}
testview::~testview()
{
}
webview.cpp
#包括“webview.h”
#包括
#包括
#包括
webview::webview(QWidget*父项)
:QWebView(父级)
{
}
webview::~webview()
{
}
void webview::printPDF(bool ok)
{
QPrinter打印机(QPrinter::高分辨率);
QString fileName=QFileDialog::getSaveFileName(这是“导出PDF”,
QString(),“*.pdf”);
打印机。设置页面大小(QPrinter::A4);
打印机设置方向(QPrinter::纵向);
打印机.setOutputFormat(QPrinter::PdfFormat);
打印机.setOutputFileName(文件名);
页面()->主机()->打印和打印机;
}
问题出在其他地方:
在我的main.cpp
中,我有以下内容:
QObject::connect(nav->getFrame(), SIGNAL(loadFinished(bool)), nav, SLOT(printPDF(bool)));
[...]
delete args;
delete pdf;
delete nav;
return app.exec();
app.exec()
是一种无限循环,它处理Qt事件,因此允许程序不关闭。
如果在调用此函数之前继续删除,则将使用新释放的指针
如果我这样做:
bool result = app.exec();
delete args;
delete pdf;
delete nav;
return result;
很好 没错,消息“QPaint::begin:绘画设备一次只能由一名画家绘制。”不再显示。布尔发送始终为“false”,并且已打印的页面为空白页面检查页面->大型机()->加载中的路径(QUrl::fromLocalFile(args->getSource());和page->mainFrame()->load(QUrl(args->getSource());这是一条有效的路径吗?使用webview的加载功能:连接(webview->page()->mainFrame()、信号(loadFinished(bool))、webview、插槽(printPDF(bool));webview->load(QUrl::fromLocalFile(“c:/test.html”);“是”是一条有效路径(我是sur)。我已经替换了:page->mainFrame()->load(QUrl(args->getSource());通过page->mainFrame()->load(QUrl(“)”),问题仍然存在。发送到printPDF的布尔值不适用于您使用自己的网页。是否调用WebView::setPage()在WebView中设置页面?名称页面不是一个好的选择,因为有一个方法page()在webview中获取当前页面。重命名您的页面,使用setPage()设置页面,然后您就可以在connect with getPage()中获取您的页面;非常感谢您的帮助!但问题出在其他地方。有关详细信息,我将很快答复您!
#include "webview.h"
#include <QPrinter>
#include <QWebFrame>
#include <QFileDialog>
webview::webview(QWidget *parent)
: QWebView(parent)
{
}
webview::~webview()
{
}
void webview::printPDF(bool ok)
{
QPrinter printer(QPrinter::HighResolution);
QString fileName = QFileDialog::getSaveFileName(this, "Export PDF",
QString(), "*.pdf");
printer.setPageSize(QPrinter::A4);
printer.setOrientation(QPrinter::Portrait);
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName(fileName);
page()->mainFrame()->print(&printer);
}
QObject::connect(nav->getFrame(), SIGNAL(loadFinished(bool)), nav, SLOT(printPDF(bool)));
[...]
delete args;
delete pdf;
delete nav;
return app.exec();
bool result = app.exec();
delete args;
delete pdf;
delete nav;
return result;