C++ 不透明度不适用于QWebEngineView和半透明背景

C++ 不透明度不适用于QWebEngineView和半透明背景,c++,qt,qt5,qwebengineview,C++,Qt,Qt5,Qwebengineview,也许这是一个错误。有一个顶级小部件必须具有下拉阴影。在这个小部件中,我想显示一个浏览器(只能够呈现html)。顶级小部件的不透明度必须是可调的。 要使dropshadow按预期工作(不显示黑色边框),我们需要将Qt::WA_TranslucentBackground设置为true。但是不透明度的改变不起作用。为什么?但真正困扰我的是,如果你用任何其他小部件替换浏览器小部件,比如QTextEdit,不透明度的改变总是有效的,包括阴影 我在Windows 8.1主机上使用带msvc2015的Qt5.

也许这是一个错误。有一个顶级小部件必须具有下拉阴影。在这个小部件中,我想显示一个浏览器(只能够呈现html)。顶级小部件的不透明度必须是可调的。 要使dropshadow按预期工作(不显示黑色边框),我们需要将
Qt::WA_TranslucentBackground
设置为true。但是不透明度的改变不起作用。为什么?但真正困扰我的是,如果你用任何其他小部件替换浏览器小部件,比如
QTextEdit
,不透明度的改变总是有效的,包括阴影

我在Windows 8.1主机上使用带msvc2015的Qt5.8。 以下是一个有效的示例:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QWidget>
#include <QWebEngineView>
#include <QWebEnginePage>
#include <QVBoxLayout>
#include <QSlider>
#include <QGraphicsDropShadowEffect>

class TestWidget : public QWidget
{
    Q_OBJECT
public:
    explicit TestWidget(QWidget *parent = 0){
        this->setStyleSheet(".QWidget{color: qlineargradient(spread:pad, x1:0 y1:0, x2:1 y2:0, stop:0 rgba(0, 0, 0, 255), stop:1 rgba(255, 255, 255, 255));"
                               "background: qlineargradient( x1:0 y1:0, x2:1 y2:0, stop:0 cyan, stop:1 blue);}");

        QWebEngineView *view = new QWebEngineView;
        view->setUrl( QUrl("https://www.google.de") );
        this->setLayout(new QVBoxLayout);

        view->page()->setBackgroundColor(QColor(Qt::transparent));

        QWidget *container = new QWidget;
        container->setLayout( new QVBoxLayout );
        container->layout()->setContentsMargins(0,0,0,0);
        container->layout()->addWidget( view );
        this->layout()->addWidget( container );

        QSlider *slider = new QSlider;
        slider->setOrientation(Qt::Horizontal);
        slider->setFixedWidth(200);
        slider->setMinimum(20);
        slider->setValue(20);
        slider->setMaximum(100);
        connect(slider,&QSlider::valueChanged,this,
                [this](int value){
            this->setWindowOpacity(1.0 * value / 100.0);
        });
        slider->show();

        this->setAttribute(Qt::WA_TranslucentBackground,true);
        Qt::WindowFlags flags = 0;
        flags |= Qt::SplashScreen;
        flags |= Qt::FramelessWindowHint;
        setWindowFlags(flags);

        QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect;
        shadow->setBlurRadius(10);
        shadow->setOffset(0,2);
        shadow->setEnabled(true);
        setGraphicsEffect(shadow);
    }

    ~TestWidget(){}
};

#endif // MAINWINDOW_H
如中所述,现在只需使用以下行即可:

webEngineView->page()->setBackgroundColor(Qt::transparent);
我在Qt5.6中试用过,效果很好

为了使这个答案更有帮助,让我展示所有相关的代码

在主窗口中,我设置了以下内容:

setAttribute(Qt::WA_TranslucentBackground);
setAutoFillBackground(true);
setWindowFlags(Qt::FramelessWindowHint);
对于webEngineView对象,我设置了以下属性:

webEngineView->setAttribute(Qt::WA_TranslucentBackground);
webEngineView->setStyleSheet("background:transparent");
webEnginePage = webEngineView->page();
// https://bugreports.qt.io/browse/QTBUG-41960
webEnginePage->setBackgroundColor(Qt::transparent);
在HTML中,在CSS中使用透明背景,如下所示:

body{背景:透明;}

否则,我认为默认情况下HTML将具有白色背景


希望有帮助。

有趣。我想知道Blink引擎是否支持透明窗口?我从未见过浏览器具有此功能。如果删除“窗口”属性,更改不透明度会起作用,但会得到黑色边框。但它可能仍然与blink有关…我注意到,如果我将父视图设置为webview,而不将webview添加到布局中,它甚至不起作用。如果您不需要与内容进行任何交互,您可以将网页呈现为图像并按需显示。交互是主要问题,因此这对我来说不是解决方案。与此同时,我发现它可以与WebKit一起使用。糟糕的是,它已经从Qt中删除,取而代之的是Blink,后者使用了更多的内存,这也让事情变得更糟。从用户的角度来看,这是一个错误的决定。此外,我还注意到,使用WebKit,我可以免费获得清晰明了的字体,这也是我在blink中遇到的一个问题(见此)。如果您真的使用我的代码验证您的答案,请使用完整头文件的工作副本更新您的答案。基本上我看不出有什么不同,它也不起作用。
webEngineView->setAttribute(Qt::WA_TranslucentBackground);
webEngineView->setStyleSheet("background:transparent");
webEnginePage = webEngineView->page();
// https://bugreports.qt.io/browse/QTBUG-41960
webEnginePage->setBackgroundColor(Qt::transparent);