如何将QWebEngineUrlRequestInfo重定向到本地文件?

时间:2017-11-10 13:27:24

标签: c++ qt http-redirect http-protocols qwebengineview

我有一个简单的Qt应用程序,可以在QWebEngineView中加载页面。我想将URL中的“静态”一词的所有http请求重定向到本地文件。使用WebUrlRequestInterceptor我重新实现了interceptRequest方法。这是代码:

class MyWebUrlRequestInterceptor : public QWebEngineUrlRequestInterceptor
{
public:
    void interceptRequest(QWebEngineUrlRequestInfo &info) {
        if (info.requestUrl().toString().contains("static")) {
            QString newUrl = QDir::currentPath() + info.requestUrl().toString().mid(21, info.requestUrl().toString().length());
            qDebug() << "new url = " << newUrl;
            info.redirect(QUrl::fromLocalFile(newUrl));
        }
    }
};

在主要功能中我做了

MyWebUrlRequestInterceptor *wuri = new MyWebUrlRequestInterceptor();
QWebEngineProfile::defaultProfile()->setRequestInterceptor(wuri);

interceptRequest似乎工作正常,但我收到了一条消息。

  

不允许加载本地资源

我在网上搜索,很多人都说我应该添加--disable-web-security标志。所以我在我的.pro文件中做了:

QMAKE_CXXFLAGS += --disable-web-security

但它似乎没有起作用。难道我做错了什么?有不同的解决方案吗?我可以制作自定义协议来提供本地文件,并在Qt中重定向到它们作为解决方法吗?

我正在使用Qt 5.9.1和QtCreator 4.3.1。

1 个答案:

答案 0 :(得分:1)

我会使用 QWebEngineUrlRequestInfo :: block 阻止请求并在 QWebEngineView 中加载本地文件(甚至可以动态读取本地文件并将其内容传递给通过 QWebEngineView :: setHtml )查看。

或者在本地监听传入的http请求,使用本地目录作为Web根目录,最后在需要时重定向到localhost,这意味着使用外部Web服务器或构建最小的服务器,可能集成在您的应用程序中。如果你去整合它,我会考虑这个:https://github.com/cesanta/mongoose