Search code examples
qtbrowser-historyqtwebengineqwebenginepage

Save and load QWebEngineHistory to a QWebEnginePage


I need to save the history of a QWebEnginePage and load it back. Therefore I want to store the history from page A in some structure and set it to page B.

In the documentation I found the following methods:

// 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)

But honestly I don't know how to work with them. I tried the following:

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;
}

And later on I want to load it back to the page:

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

I know that the QWebEngineHistory of a QWebEnginePage is const, but then I'm wondering why are there even those two methods from above? Why is there a function that "loads the web engine history into history"?

The only alternative I can think of is storing my history in a QList, but managing this is not nice and could lead to more problems (because of the whole forward/backward button etc).

Thank you very much for your help.


Solution

  • No object can be saved, what is saved is the information associated with the object so you should not create QWebEngineHistory but save and/or load the information.

    In the following example, the information is saved in a file when the application is closed and the startup is loaded.

    #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://stackoverflow.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;
    }
    

    In the same way you can save it through QSettings:

    #include <QtWebEngineWidgets>
    
    int main(int argc, char *argv[]) {
        QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
        QApplication app(argc,argv);
    
        QWebEngineView view;
        view.load(QUrl("https://stackoverflow.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;
    }