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");
    });
    
  • 然后我尝试了QWebEngineProfile::download()方法:

  • 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的概念取决于您分析它的角度。