【Qt初入江湖】实现 Cookie管理、JavaScript交互、页面打印、历史记录管理等功能实例

鱼弦:CSDN内容合伙人、CSDN新星导师、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen)

    

Qt WebEngine是一个基于Chromium引擎的浏览器引擎,它提供了许多功能来管理Web页面,如Cookie管理、JavaScript交互、页面打印、历史记录管理等。

一 初步实现

下面分别介绍这些功能的实现方法:

1. Cookie管理

Qt WebEngine提供了QWebEngineCookieStore类来管理Web页面的Cookie。我们可以使用QWebEngineProfile::defaultProfile()函数获取默认的QWebEngineProfile对象,并使用QWebEngineProfile::setPersistentCookiesPolicy()函数设置Cookie的持久性。然后,我们可以使用QWebEngineProfile::cookieStore()函数获取QWebEngineCookieStore对象,并使用它来管理Cookie。例如,以下代码演示了如何设置Cookie的持久性,并向Web页面添加Cookie:

QWebEngineProfile* profile = QWebEngineProfile::defaultProfile();
profile->setPersistentCookiesPolicy(QWebEngineProfile::AllowPersistentCookies);

QWebEngineCookieStore* cookieStore = profile->cookieStore();
QNetworkCookie cookie("name", "value");
cookie.setDomain("example.com");
cookie.setPath("/");
cookieStore->setCookie(cookie, QUrl("http://example.com"));

在上面的代码中,我们首先使用QWebEngineProfile::defaultProfile()函数获取默认的QWebEngineProfile对象,并使用QWebEngineProfile::setPersistentCookiesPolicy()函数设置Cookie的持久性。然后,我们使用QWebEngineProfile::cookieStore()函数获取QWebEngineCookieStore对象,并使用setCookie()函数向Web页面添加Cookie。

2. JavaScript交互

Qt WebEngine提供了QWebEnginePage::runJavaScript()函数来与Web页面的JavaScript代码进行交互。我们可以使用此函数执行JavaScript代码,并在C++代码中获取JavaScript代码的返回值。例如,以下代码演示了如何执行JavaScript代码,并在C++代码中获取JavaScript代码的返回值:

QWebEngineView view;
view.show();

QWebEnginePage* page = view.page();
QVariant result = page->runJavaScript("document.title");
qDebug() << "Page title:" << result.toString();

在上面的代码中,我们首先创建了一个QWebEngineView对象,并使用show()函数显示它。然后,我们使用QWebEngineView::page()函数获取QWebEnginePage对象,并使用QWebEnginePage::runJavaScript()函数执行JavaScript代码。最后,我们使用toString()函数将返回值转换为字符串,并将其输出到控制台。

3. 页面打印

Qt WebEngine提供了QWebEnginePage::print()函数来打印Web页面。我们可以使用此函数将Web页面打印到打印机或PDF文件中。例如,以下代码演示了如何将Web页面打印到PDF文件中:

QWebEngineView view;
view.show();

QWebEnginePage* page = view.page();
page->printToPdf("page.pdf", [](const QByteArray& pdf){
    QFile file("page.pdf");
    if(file.open(QIODevice::WriteOnly))
    {
        file.write(pdf);
        file.close();
    }
});

在上面的代码中,我们首先创建了一个QWebEngineView对象,并使用show()函数显示它。然后,我们使用QWebEngineView::page()函数获取QWebEnginePage对象,并使用QWebEnginePage::printToPdf()函数将Web页面打印到PDF文件中。最后,我们使用lambda表达式来处理生成的PDF文件。

4. 历史记录管理

Qt WebEngine提供了QWebEngineHistory类来管理Web浏览历史。我们可以使用QWebEnginePage::history()函数获取QWebEngineHistory对象,并使用它来管理Web浏览历史。例如,以下代码演示了如何在Web浏览历史中后退和前进:

QWebEngineView view;
view.show();

QWebEnginePage* page = view.page();
QWebEngineHistory* history = page->history();
history->back();
history->forward();

在上面的代码中,我们首先创建了一个QWebEngineView对象,并使用show()函数显示它。然后,我们使用QWebEngineView::page()函数获取QWebEnginePage对象,并使用QWebEnginePage::history()函数获取QWebEngineHistory对象。最后,我们使用back()函数和forward()函数在Web浏览历史中后退和前进。

二 补充实现

补充:以上提到的Cookie管理、JavaScript交互、页面打印、历史记录管理等功能,都可以在Qt WebEngine中通过信号和槽机制实现,以下是详细说明和代码示例:

除了使用QWebEngineCookieStore类进行Cookie管理外,Qt WebEngine还提供了QWebEngineProfile::downloadRequested()信号和QWebEngineProfile::profileCreated()信号,可以用于拦截和修改Cookie。

例如,以下代码演示了如何使用QWebEngineProfile::downloadRequested()信号拦截Cookie:

QWebEngineProfile* profile = QWebEngineProfile::defaultProfile();
QObject::connect(profile, &QWebEngineProfile::downloadRequested,
                 [=](const QWebEngineDownloadItem& download){
    const QList<QNetworkCookie>& cookies = download.cookies();
    // 处理Cookie
});

在上面的代码中,我们使用QWebEngineProfile::defaultProfile()函数获取默认的QWebEngineProfile对象,并使用QObject::connect()函数连接QWebEngineProfile::downloadRequested()信号。当Web页面请求下载时,该信号被触发,并传递一个QWebEngineDownloadItem对象作为参数,该对象包含了下载请求的信息,包括Cookie。

除了使用QWebEnginePage::runJavaScript()函数进行JavaScript交互外,Qt WebEngine还提供了QWebEnginePage::javaScriptConsoleMessage()信号和QWebEnginePage::javaScriptPrompt()信号,可以用于在C++代码中处理JavaScript代码的输出和输入。

例如,以下代码演示了如何使用QWebEnginePage::javaScriptConsoleMessage()信号输出JavaScript代码的输出:

QWebEngineView view;
view.show();

QWebEnginePage* page = view.page();
QObject::connect(page, &QWebEnginePage::javaScriptConsoleMessage,
                 [=](const QString& message, int lineNumber, const QString& sourceID){
    qDebug() << "JavaScript output:" << message << "at line" << lineNumber << "in" << sourceID;
});

page->runJavaScript("console.log('Hello from JavaScript!')");

在上面的代码中,我们使用QWebEngineView类创建一个Web页面,并使用QWebEngineView::page()函数获取QWebEnginePage对象。然后,我们使用QObject::connect()函数连接QWebEnginePage::javaScriptConsoleMessage()信号,该信号在JavaScript代码输出到控制台时被触发,并传递输出的消息、行号和源ID作为参数。最后,我们使用QWebEnginePage::runJavaScript()函数执行JavaScript代码,该代码输出一条消息到控制台。

除了使用QWebEnginePage::print()函数进行页面打印外,Qt WebEngine还提供了QWebEnginePage::printRequested()信号和QWebEnginePage::pdfPrintingFinished()信号,可以用于在C++代码中处理页面打印的输出和结果。

例如,以下代码演示了如何使用QWebEnginePage::printRequested()信号和QWebEnginePage::pdfPrintingFinished()信号将Web页面打印到PDF文件中:

QWebEngineView view;
view.show();

QWebEnginePage* page = view.page();
QObject::connect(page, &QWebEnginePage::printRequested, [=](QWebEnginePdfPrinter* printer){
    printer->setOutputFileName("page.pdf");
    printer->printToPdf();
});
QObject::connect(page, &QWebEnginePage::pdfPrintingFinished, [=](const QByteArray& pdf){
    QFile file("page.pdf");
    if(file.open(QIODevice::WriteOnly))
    {
        file.write(pdf);
        file.close();
    }
});

view.load(QUrl("http://www.example.com"));

在上面的代码中,我们使用QWebEngineView类创建一个Web页面,并使用QWebEngineView::page()函数获取QWebEnginePage对象。然后,我们使用QObject::connect()函数连接QWebEnginePage::printRequested()信号,该信号在Web页面请求打印时被触发,并传递一个QWebEnginePdfPrinter对象作为参数。我们可以使用该对象设置输出文件名并执行打印操作。最后,我们使用QObject::connect()函数连接QWebEnginePage::pdfPrintingFinished()信号,该信号在打印完成后被触发,并传递生成的PDF文件的二进制数据作为参数。我们在这个信号的处理函数中,将生成的PDF文件保存到本地。

除了使用QWebEngineHistory类进行历史记录管理外,Qt WebEngine还提供了QWebEnginePage::urlChanged()信号和QWebEnginePage::titleChanged()信号,可以用于在C++代码中处理Web浏览历史的变化。

例如,以下代码演示了如何使用QWebEnginePage::urlChanged()信号和QWebEnginePage::titleChanged()信号监视Web浏览历史的变化:

QWebEngineView view;
view.show();

QWebEnginePage* page = view.page();
QObject::connect(page, &QWebEnginePage::urlChanged, [=](const QUrl& url){
    qDebug() << "Page URL changed:" << url;
});
QObject::connect(page, &QWebEnginePage::titleChanged, [=](const QString& title){
    qDebug() << "Page title changed:" << title;
});

view.load(QUrl("http://www.example.com"));

在上面的代码中,我们使用QWebEngineView类创建一个Web页面,并使用QWebEngineView::page()函数获取QWebEnginePage对象。然后,我们使用QObject::connect()函数连接QWebEnginePage::urlChanged()信号和QWebEnginePage::titleChanged()信号,这些信号在Web浏览历史的URL或标题发生变化时被触发。我们在这些信号的处理函数中输出变化后的URL或标题。最后,我们使用QWebEngineView::load()函数加载Web页面,这将触发QWebEnginePage::urlChanged()信号和QWebEnginePage::titleChanged()信号。

Qt WebEngine提供了丰富的功能来管理Web页面,包括Cookie管理、JavaScript交互、页面打印、历史记录管理等。开发者可以根据自己的需求选择合适的方法和API来实现这些功能。同时,通过信号和槽机制,开发者还可以在C++代码中处理Web页面的事件和变化。

猜你喜欢

转载自blog.csdn.net/feng1790291543/article/details/131805351
今日推荐