C++ 如何在QWebEngineView中保存动态生成的网页?
我正在将网页加载到C++ 如何在QWebEngineView中保存动态生成的网页?,c++,qt,qt5,qwebengineview,qwebenginepage,C++,Qt,Qt5,Qwebengineview,Qwebenginepage,我正在将网页加载到QWebEngineView。用户创建不同类型的表(报表),然后需要将这些表作为网页保存到本地计算机。以下是我尝试过的: 这里我使用了一个QWebEnginePage::save()方法,但什么也没有发生: connect(saveButton, &QPushButton::clicked, this, [this]() { engineWebView->page()->save("save.html"); }); 然后我尝试了QWebEngine
QWebEngineView
。用户创建不同类型的表(报表),然后需要将这些表作为网页保存到本地计算机。以下是我尝试过的:
QWebEnginePage::save()
方法,但什么也没有发生:
connect(saveButton, &QPushButton::clicked, this, [this]()
{
engineWebView->page()->save("save.html");
});
connect(saveButton,&QPushButton::clicked,this,[this]()
{
engineWebView->page()->下载(engineWebView->page()->url(),“保存”);
});
连接(engineWebView->page()->profile(),&QWebEngineProfile::downloadRequested,this,[this](QWebEngineDownloadItem*下载)
{
下载->设置路径(“save.html”);
下载->接受();
});
在第二种解决方案中,我只能保存第一个加载的网页。没有动态创建的内容
如何保存动态创建的数据
编辑:最小可复制代码:
#include <QApplication>
#include <QDebug>
#include <QFile>
#include <QHBoxLayout>
#include <QPushButton>
#include <QWebEngineProfile>
#include <QWebEngineView>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWebEngineView *engine = new QWebEngineView;
QObject::connect(engine->page()->profile(), &QWebEngineProfile::downloadRequested, [](QWebEngineDownloadItem *download) {
download->setPath("download.html");
download->accept();
});
QPushButton *saveButton = new QPushButton("Save");
QObject::connect(saveButton, &QPushButton::clicked, [engine]()
{
engine->page()->save("save.html");
});
QPushButton *toHtmlButton = new QPushButton("ToHtml");
QObject::connect(toHtmlButton, &QPushButton::clicked, [engine]()
{
engine->page()->toHtml([](QString html){
QFile file("toHtml.html");
if (file.open(QFile::WriteOnly | QFile::Text))
{
QTextStream stream(&file);
stream << html;
file.waitForBytesWritten(-1);
file.close();
}
else
qDebug() << "Cannot create a file";
});
});
QPushButton *downloadButton = new QPushButton("Download");
QObject::connect(downloadButton, &QPushButton::clicked, [engine]()
{
engine->page()->download(engine->page()->url());
});
QHBoxLayout *hLyt = new QHBoxLayout;
hLyt->addWidget(saveButton);
hLyt->addWidget(toHtmlButton);
hLyt->addWidget(downloadButton);
QVBoxLayout *vLyt = new QVBoxLayout;
vLyt->addLayout(hLyt);
vLyt->addWidget(engine);
QWidget *mainWin = new QWidget;
mainWin->setLayout(vLyt);
mainWin->show();
// The url is an example for react usage. I am generating data using ReactJS that's why I use this example. What I need is to store the exact view of the dynamically generated calculator
engine->load(QUrl("https://ahfarmer.github.io/calculator/"));
return app.exec();
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
QApplication应用程序(argc、argv);
QWebEngineView*引擎=新的QWebEngineView;
QObject::connect(引擎->页面()->profile(),&QWebEngineProfile::downloadRequested,[](QWebEngineDownloadItem*下载){
下载->设置路径(“download.html”);
下载->接受();
});
QPushButton*saveButton=新的QPushButton(“保存”);
QObject::connect(保存按钮,&QPushButton::单击,[engine]()
{
引擎->页面()->保存(“save.html”);
});
QPushButton*toHtmlButton=新的QPushButton(“ToHtml”);
QObject::connect(toHtmlButton,&QPushButton::单击,[引擎]()
{
引擎->页面()->toHtml([](QString html){
QFile文件(“toHtml.html”);
if(file.open(QFile::WriteOnly | QFile::Text))
{
QTextStream流(&文件);
流下载(引擎->页面()->url());
});
QHBoxLayout*hLyt=新的QHBoxLayout;
hLyt->addWidget(保存按钮);
hLyt->addWidget(toHtmlButton);
hLyt->addWidget(下载按钮);
QVBoxLayout*vLyt=新的QVBoxLayout;
vLyt->添加布局(hLyt);
vLyt->addWidget(引擎);
QWidget*mainWin=新的QWidget;
mainWin->setLayout(vLyt);
mainWin->show();
//url是react用法的一个示例。我使用ReactJS生成数据,这就是我使用此示例的原因。我需要的是存储动态生成的计算器的确切视图
发动机->负载(QUrl(“https://ahfarmer.github.io/calculator/"));
返回app.exec();
}
如果要获取动态生成的html,可以使用javascript通过以下方法获取文档的详细信息:
#包括
int main(int argc,char*argv[])
{
QApplication应用程序(argc、argv);
QWebEngineView*视图=新的QWebEngineView;
QPushButton*按钮=新的QPushButton(“按我”);
按钮->设置启用(错误);
QObject::connect(按钮,&QPushButton::单击,[view]()
{
查看->页面()->运行JavaScript(“document.documentElement.outerHTML”,[](const-QVariant&v){
QFile文件(“outerHTML.html”);
如果(!file.open(QFile::WriteOnly | QFile::Text)){
qDebug()加载(QUrl(“https://ahfarmer.github.io/calculator/"));
qw;
QVBoxLayout*lay=新的QVBoxLayout(&w);
lay->addWidget(按钮);
lay->addWidget(视图);
w、 调整大小(640480);
w、 show();
返回app.exec();
}
如果您使用您提供的url显示您得到的(HTML)和您想要得到的(HTML),“动态创建”可能是主观的。另一方面,HTML报告的应用程序通常允许您以特定格式(CSV、PDF、XLSX等)下载/导出这些文件。您的报告系统没有提供吗?@eyllanesc这就是问题所在。我们的报告系统只是使用标记(,etc
)生成一个HTML表。@eyllanesc请在Chrome上打开该URL。如果您看到页面源代码(Ctrl+U
),它只包含一行调用JS函数的代码。但是如果您检查一些DOM元素(Ctrs+Shift+I
)它显示“动态生成”的数据(大量HTML代码)。我需要的正是这些代码。你能解释一下为什么问题中建议的方法似乎不起作用吗?@Trilarion是,在动态网页中有几个HTML,在以前的方法中,它们主要关注从服务器下载的HTML,所以我假设Qt WebEngine的开发人员认为指定的方法我们只需要这些信息,但它们也给了我们更多的自由,因为我们可以使用javascript与DOM交互。@Triarion总之,HTML的概念取决于您分析它的角度。