QWebEngineView添加自定义网址协议UrlScheme

QWebEngineView可以和js交互需要使用QWebChannel,如果不使用的话,js可以请求自定义网址协议,相当于请求服务器,但是不用Qt专门做服务器,不占用系统端口。

如果结合系统自定义URL注册,可以达到访问自定义URL,启动我们的Qt程序,程序里再处理自定义URL网址

1.继承QWebEngineUrlSchemeHandler 创建协议处理类

class AMUrlSchemeHandler : public QWebEngineUrlSchemeHandler
{
    Q_OBJECT

public:
    AMUrlSchemeHandler(QObject *parent);
    ~AMUrlSchemeHandler();


    virtual void requestStarted(QWebEngineUrlRequestJob* pReqJob);
};

2. 在requestStarted编写响应内容

void AMUrlSchemeHandler::requestStarted(QWebEngineUrlRequestJob* pReqJob)
{
    QJsonObject jsonObj;
    jsonObj.insert("requestUrl", pReqJob->requestUrl().toString());
    jsonObj.insert("requestMethod", QString(pReqJob->requestMethod()));
    jsonObj.insert("initiator", pReqJob->initiator().toString());

    if (pReqJob->requestUrl().toString() == "amurl://www.baidu.com")
    {
        if (pReqJob->requestMethod() == "GET")
        {
            jsonObj.insert("result", "GET 0");
        }
        else if (pReqJob->requestMethod() == "POST")
        {
            jsonObj.insert("result", "POST 1");
        }
        else
        {
            pReqJob->fail(QWebEngineUrlRequestJob::RequestDenied);
            return;
        }
    }


    QBuffer* buffer = new QBuffer;
    connect(pReqJob, SIGNAL(destroyed()), buffer, SLOT(deleteLater()));
    buffer->open(QIODevice::WriteOnly);
    QString strJson = QJsonDocument(jsonObj).toJson(QJsonDocument::Indented);
    buffer->write(strJson.toUtf8());
    buffer->close();

    pReqJob->reply("application/json", buffer);
}

3.在QApplication初始化前注册自定义协议QWebEngineUrlScheme::registerScheme(scheme);

4. 再安装协议处理类installUrlSchemeHandler("amurl", handler);

int main(int argc, char *argv[])
{
    QWebEngineUrlScheme scheme("amurl");
    scheme.setSyntax(QWebEngineUrlScheme::Syntax::Path);
    scheme.setFlags(QWebEngineUrlScheme::SecureScheme);
    QWebEngineUrlScheme::registerScheme(scheme);

    QApplication a(argc, argv);

    AMUrlSchemeHandler* handler = new AMUrlSchemeHandler(&a);
    QWebEngineProfile::defaultProfile()->installUrlSchemeHandler("amurl", handler);

    StudyQWebEngineUrlScheme w;
    w.show();
    return a.exec();
}

5. 我们可以访问试试

StudyQWebEngineUrlScheme::StudyQWebEngineUrlScheme(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

    QVBoxLayout* pLayoutMain = new QVBoxLayout(ui.centralWidget);
    ui.centralWidget->setLayout(pLayoutMain);
    pLayoutMain->setContentsMargins(0, 30, 0, 0);
    {
        m_pView = new QWebEngineView(ui.centralWidget);
        pLayoutMain->addWidget(m_pView);
        {
            QWebEnginePage* pWebEnginePage = new QWebEnginePage(m_pView);
            m_pView->setPage(pWebEnginePage);
        }

        QWebEngineView* view1 = new QWebEngineView(m_pView);
        pLayoutMain->addWidget(view1);
        m_pView->page()->setDevToolsPage(view1->page());
    }

    //Get请求
    m_pView->load(QUrl("amurl://www.Baidu.com"));

    connect(ui.btnPost, &QPushButton::clicked, this, &StudyQWebEngineUrlScheme::sltBtnPostClicked);
    connect(ui.btnOther, &QPushButton::clicked, this, &StudyQWebEngineUrlScheme::sltBtnOtherClicked);
}

void StudyQWebEngineUrlScheme::sltBtnPostClicked()
{
    QWebEngineHttpRequest  httpReq;
    httpReq.setUrl(QUrl("Amurl://www.Baidu.com"));
    httpReq.setMethod(QWebEngineHttpRequest::Post);
    m_pView->load(httpReq);
    //POST请求好像无效,无法处理
}

void StudyQWebEngineUrlScheme::sltBtnOtherClicked()
{
    QWebEngineHttpRequest  httpReq;
    httpReq.setUrl(QUrl("Amurl://www.Baidu.coM"));
    httpReq.setMethod(QWebEngineHttpRequest::Method(2));
    m_pView->load(httpReq);
    //Method>=2,请求都转为Get请求了
}

官方示例:WebEngine Widgets WebUI 范例| Qt WebEngine 5.15.1 -中文文档编制,帮助,手册,教程

本文示例代码:

所有代码的7z压缩后的Base64编码如下:

(注意复制出来是一行,再Base64 Decode,保存成7z文件,再解压即可)

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

  • 21
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值