簡體   English   中英

QT 5.8 Webview如何處理請求,如何截獲?

[英]QT 5.8 how does Webview do a request and how can I intercept it?

我正在嘗試將QnetworkRequest傳遞給位於main.qml文件中的webView而不是“ url”。 我通過引用webView對象和setproperty函數來傳遞url。 但是,尚未找到合適的功能,並且實際上不知道從何處開始以創建新功能或修改現有的webView代碼以使其正常工作。 有沒有一種方法可以將源代碼編輯到.qml文件中的webView中。 當然,我只是在學習QT框架。

我已經嘗試過WebengineView,但是Webview加載頁面的速度要快得多。 這對應用程序至關重要

我想真正的問題是Webview如何執行請求,如何截取請求?

main.qml

import QtQuick 2.2
import QtQuick.Controls 1.1
import QtWebView 1.1
import QtQuick.Layouts 1.1
import QtQuick.Controls.Styles 1.2


ApplicationWindow {


    flags: Qt.FramelessWindowHint
    visible: true
    x: 600   
    y: 400
    width:  500      
    height: 500 
    title: webView.title

    WebView {
        id: webView
        anchors.fill: parent
        objectName: "webView"

       //setting this value through main.cpp
       // url: "https://www.google.com"


        onLoadingChanged: {
            if (loadRequest.errorString)
                console.error(loadRequest.errorString);
        }
    }
}

main.cpp中

     int main(int argc, char *argv[])
        {

            QGuiApplication app(argc, argv);
            QtWebView::initialize();

            QQmlApplicationEngine engine;

//How to Pass THIS request to the webview instead of url?
 QNetworkRequest request;

 request.setUrl(QUrl("http://google.com"));
 request.setRawHeader("Accept-Charset", "UTF-8,*;q=0.5");

            engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

            QObject *rootObject = engine.rootObjects().first();
            QObject *qmlObject = rootObject->findChild<QObject*>("webView");




//Able to set the URL for the webView:
        qmlObject->setProperty("url", "https://www.google.com" );  

            return app.exec();
        }

AFAIK,所有QML組件都使用QNetworkAccessManager 您可以注冊自己的工廠,讓自己的班級處理網絡。 您可以重載get方法並在url與google相匹配的情況下更改標題,或執行以下操作:

class MyNetworkManager : public QNetworkAccessManager {
public:
QNetworkReply *QNetworkAccessManager::get(const QNetworkRequest &request) {
    if (request.url.contains("google")) {
        request.setRawHeader("Accept-Charset", "UTF-8,*;q=0.5");
    }
    return QNetworkAccessManager::get(request)
}
}

當然,這里的request是const,因此您必須構造一個新的請求,但是我希望這顯示了基本思想!

有關如何在main.cpp注冊自己的NetworkAccessManagerFactory的示例:

http://doc.qt.io/qt-5/qtqml-networkaccessmanagerfactory-example.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM