【问题标题】:How to redirect QWebEngineUrlRequestInfo to local files?如何将 QWebEngineUrlRequestInfo 重定向到本地文件?
【发布时间】:2017-11-10 13:27:23
【问题描述】:

我有一个简单的 Qt 应用程序,它在 QWebEngineView 中加载一个页面。我想将url中带有“static”一词的所有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。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢@p-a-o-l-o!我不确定我是否理解。如果页面要求图片,我如何通过setHtml加载它?
    • 如果文件内容不是 html,最好按照建议使用本地 Web 服务器。在尝试嵌入之前,您可以使用外部解决方案来测试此解决方案,如果您喜欢 nodejs (expressjs.com)
    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 2010-12-02
    • 2022-01-26
    • 2017-02-12
    • 1970-01-01
    • 2012-07-20
    • 2014-06-21
    • 1970-01-01
    相关资源
    最近更新 更多