C++ QWebPage/QPrinter-can';t加载页面

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

我是新的在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->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;