You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt6 WebEngine存储权限请求被拒,如何在C++/QML中开启权限?

解决Qt6 WebEngine存储权限请求被拒绝的问题

问题描述

基于Qt6开发简易Web浏览器时,访问https://youtube.com、https://play.geforcenow.com等网站,控制台会输出以下错误:

js: requestStorageAccessFor: Permission denied.

初始提示为:

Qt6 WebEngine: js: requestStorageAccess: Permission denied. - Need to enable access

需要通过C++或QML配置授予存储请求权限。


核心原因

这类网站依赖第三方存储访问权限(如Cookie、本地存储),Qt WebEngine默认限制了该类权限,需显式开启。


解决步骤

1. C++全局权限配置

在Qt WebEngine初始化前,设置全局WebEngine配置,允许存储访问请求。修改main.cpp:

添加必要头文件

#include <QWebEngineSettings>

在QtWebEngineQuick::initialize()前添加权限配置

// 允许第三方资源请求存储访问权限
QWebEngineSettings::defaultSettings()->setAttribute(QWebEngineSettings::AllowThirdPartyStorageAccess, true);
// 无需用户手动触发(如点击)即可授予存储权限,适配部分自动请求权限的网站
QWebEngineSettings::defaultSettings()->setAttribute(QWebEngineSettings::AllowStorageAccessByUserGesture, false);

2. QML权限请求监听(可选,精细控制)

如果全局配置无法满足需求,可在QML中监听WebEngineView的权限请求信号,手动处理存储权限:

修改Main.qml中的WebEngineView:

WebEngineView {
    id: webView
    anchors.fill: parent
    url: "https://youtube.com/"

    onPermissionRequested: {
        // 仅处理存储权限请求
        if (permission.requestType === WebEnginePermissionRequest.StorageAccess) {
            permission.grant();
        }
    }
}

完整修改后代码示例

修改后的main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QtWebEngineQuick/qtwebenginequickglobal.h>
#include <QWebEngineSettings>

int main(int argc, char *argv[]){
    /* QCore Application settings */
    QCoreApplication::setApplicationName("Browser");
    QCoreApplication::setOrganizationName("Project");

    /* GPU API */
#ifdef USE_OPEN_GL_ES
    QCoreApplication::setAttribute(Qt::AA_UseOpenGLES);
#else
    QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL);
#endif

    /* 配置WebEngine存储权限 */
    QWebEngineSettings::defaultSettings()->setAttribute(QWebEngineSettings::AllowThirdPartyStorageAccess, true);
    QWebEngineSettings::defaultSettings()->setAttribute(QWebEngineSettings::AllowStorageAccessByUserGesture, false);

    /* Start Qt WebEngine */
    QtWebEngineQuick::initialize();

    /* Start GUI */
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed, &app,[]() { QCoreApplication::exit(-1); }, Qt::QueuedConnection);
    engine.loadFromModule("Youtube_NOW", "Main"); // 修正原代码模块名笔误
    return app.exec();
}

修改后的Main.qml

import QtQuick
import QtWebEngine
import QtQuick.Controls

ApplicationWindow {
    visible: true
    width: 800
    height: 640
    title: qsTr("Youtube Browser")

    WebEngineView {
        id: webView
        anchors.fill: parent
        url: "https://youtube.com/"

        onPermissionRequested: {
            if (permission.requestType === WebEnginePermissionRequest.StorageAccess) {
                permission.grant();
            }
        }
    }
}

注意事项

  • 确保Qt版本≥6.4,AllowThirdPartyStorageAccess和AllowStorageAccessByUserGesture为Qt6.4新增属性
  • 全局配置已生效时,可省略QML的信号处理逻辑,两者可单独或配合使用
  • 原代码中engine.loadFromModule("QtForce_NOW", "Main")存在模块名笔误,需修正为Youtube_NOW

内容的提问来源于stack exchange,提问作者euraad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 11:44:49