Непрозрачность не работает с QWebEngineView и полупрозрачный фон

Возможно, это ошибка. Есть виджет верхнего уровня, который должен иметь тень. Внутри этого виджета я хочу отобразить браузер (только для возможности рендеринга HTML). Непрозрачность виджета верхнего уровня должна быть регулируемой.
Чтобы тени работали как положено (не показывать черную рамку) нам нужно Qt::WA_TranslucentBackground быть установленным в истину. Но тогда изменение непрозрачности не работает. Зачем? Но что меня действительно беспокоит, так это то, что если вы замените виджет браузера с любым другим виджетом, скажи QTextEditИзменение непрозрачности работает всегда, в том числе с тенью.

Я использую Qt5.8 с msvc2015 на хосте Windows 8.1.
Вот рабочий минимальный пример:

#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

Про файл:

QT       += core gui webenginewidgets

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = transparent-webpage-over-widget
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += main.cpp

HEADERS  += mainwindow.h

2

Решение

Как уже упоминалось в https://bugreports.qt.io/browse/QTBUG-41960, теперь это работает, просто используя эту строку:

webEngineView->page()->setBackgroundColor(Qt::transparent);

Я пробовал это в Qt 5.6, и это работает хорошо.

Чтобы сделать этот ответ более полезным, позвольте мне показать весь соответствующий код.

В MainWindow я установил это:

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 { background: transparent; }

в противном случае, я думаю, что по умолчанию HTML будет иметь белый фон

Я надеюсь, что это помогает.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]