概述:使用 QWebEngineView 时窗体不显示或半透明的问题解决。

问题描述

使用 QWebEngineView 控件后,如果父窗体设置了以下属性,会导致窗口不显示或半透明:

setWindowFlags(Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground);

解决方案

方法一:不使用透明背景属性

setWindowFlags(Qt::FramelessWindowHint);
// 注释掉透明背景属性
// setAttribute(Qt::WA_TranslucentBackground);

方法二:设置 OpenGL 环境

在 main.cpp 中设置:

int main(int argc, char *argv[])
{
    // 使用 Angle 后端
    qputenv("QT_OPENGL", "angle");
    
    // 或禁用沙箱
    qputenv("QT_WEBENGINE_DISABLE_SANDBOX", "1");
    
    QApplication a(argc, argv);
    // ...
}

方法三:设置 QWebEngineView 属性

QWebEngineView *webView = new QWebEngineView(this);
 
// 设置原生窗口属性
webView->setAttribute(Qt::WA_DontCreateNativeAncestors);
webView->setAttribute(Qt::WA_NativeWindow);

方法四:使用 QGraphicsView 替代

QGraphicsScene *scene = new QGraphicsScene(this);
QGraphicsView *view = new QGraphicsView(scene);
 
QWebEngineView *webView = new QWebEngineView();
QGraphicsProxyWidget *proxy = scene->addWidget(webView);

完整示例

#include <QApplication>
#include <QWebEngineView>
#include <QWidget>
 
class BrowserWindow : public QWidget
{
public:
    BrowserWindow(QWidget *parent = nullptr) : QWidget(parent)
    {
        // 设置无边框
        setWindowFlags(Qt::FramelessWindowHint);
        
        // 不设置透明背景
        // setAttribute(Qt::WA_TranslucentBackground);
        
        // 创建 WebEngineView
        m_webView = new QWebEngineView(this);
        m_webView->setAttribute(Qt::WA_NativeWindow);
        
        // 设置布局
        QVBoxLayout *layout = new QVBoxLayout(this);
        layout->setContentsMargins(0, 0, 0, 0);
        layout->addWidget(m_webView);
        
        // 加载页面
        m_webView->load(QUrl("https://www.baidu.com"));
    }
 
private:
    QWebEngineView *m_webView;
};

相关链接


更新时间: 2026-03-27