将 QWebEngineHistory 保存并加载到 QWebEnginePage

Posted

技术标签:

【中文标题】将 QWebEngineHistory 保存并加载到 QWebEnginePage【英文标题】:Save and load QWebEngineHistory to a QWebEnginePage 【发布时间】:2019-12-03 10:51:01 【问题描述】:

我需要保存 QWebEnginePage 的历史记录并将其加载回来。因此,我想以某种结构存储页面 A 的历史并将其设置为页面 B。

在文档中我发现了以下方法:

// Saves the web engine history history into stream.
QDataStream &operator<<(QDataStream &stream, const QWebEngineHistory &history)

// Loads the web engine history from stream into history.
QDataStream &operator>>(QDataStream &stream, QWebEngineHistory &history)

但老实说,我不知道如何与他们合作。 我尝试了以下方法:

QWebEnginePage *m_history;
...
...
void setHistory(QWebEngineHistory *history)
   QDataStream data;
   data << history; //Hoping that the content of data is persistent after deleting of the QWebEnginePage where the history is coming from
   data >> m_history;

稍后我想将其加载回页面:

m_history >> m_webEnginePage.history(); // Pseudo-Code

我知道QWebEnginePageQWebEngineHistory 是const,但是我想知道为什么上面还有这两种方法?为什么会有“将网络引擎历史载入历史”的功能?

我能想到的唯一选择是将我的历史记录存储在QList 中,但管理它并不好,并且可能导致更多问题(因为整个前进/后退按钮等)。

非常感谢您的帮助。

【问题讨论】:

【参考方案1】:

无法保存对象,保存的是与对象相关的信息,因此您不应创建 QWebEngineHistory 而是保存和/或加载信息。

在以下示例中,当应用程序关闭并加载启动时,信息将保存在一个文件中。

#include <QtWebEngineWidgets>

int main(int argc, char *argv[]) 
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QApplication app(argc,argv);

    const QString filename = "history.bin";

    QWebEngineView view;
    view.load(QUrl("https://***.com"));

    // load
        QFile file(filename);
        if(file.open(QFile::ReadOnly))
            qDebug() << "load";
            QDataStream ds(&file);
            ds >> *(view.page()->history());
        
      

    view.resize(640, 480);
    view.show();

    int ret = app.exec();

    // save
        QFile file(filename);
        if(file.open(QFile::WriteOnly))
            qDebug() << "save";
            QDataStream ds(&file);
            ds << *(view.page()->history());
        
      

    return ret;

同理可以通过QSettings保存:

#include <QtWebEngineWidgets>

int main(int argc, char *argv[]) 
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QApplication app(argc,argv);

    QWebEngineView view;
    view.load(QUrl("https://***.com"));

    // load
        QSettings settings;
        QByteArray ba = settings.value("page/history").toByteArray();
        QDataStream ds(&ba, QIODevice::ReadOnly);
        ds >> *(view.page()->history());
      

    view.resize(640, 480);
    view.show();

    int ret = app.exec();

    // save
        QSettings settings;
        QByteArray ba;
        QDataStream ds(&ba, QIODevice::WriteOnly);
        ds << *(view.page()->history());
        settings.setValue("page/history", ba);
     

    return ret;

【讨论】:

首先非常感谢您提供的详细信息! 我的评论发布得太早了,无法再编辑了...所以再次:非常感谢您提供的详细信息!它确实解决了我的问题并帮助我很好地理解了它:) 我一直在寻找它为什么不起作用,直到我发现我忘记了对 ds history( ));...再次感谢!

以上是关于将 QWebEngineHistory 保存并加载到 QWebEnginePage的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 datagridview 保存到 XML 并加载

如何将 QJsonDocument 保存并加载到文件中?

Pandas将dataframe保存为pickle文件并加载保存后的pickle文件查看dataframe数据实战

将 UIColor 保存到 NSUserDefaults 并从中加载

使用 Java 将嵌套地图保存并加载到文本文件中

将图像保存到数据库并从服务器加载