Commit 2b3de73d authored by Laszlo Agocs's avatar Laszlo Agocs
Browse files

Add QQuickWidget::setClearColor()


And make qquickviewcomparison able to demonstrate how to create a
partially transparent QQuickWidget.

Avoid also recreating the QQuickView/QQuickWidget multiple times
when switching between the radio buttons.

[ChangeLog] Added QQuickWidget::setClearColor() in order to support
semi-transparent QQuickWidgets.

Change-Id: I319ad4afbe909530274d09f2a7fcff23730d6ebd
Reviewed-by: default avatarJørgen Lind <jorgen.lind@digia.com>
parent 2fea3d18
dev 5.10 5.11 5.12 5.12.1 5.12.10 5.12.11 5.12.12 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13 5.13.0 5.13.1 5.13.2 5.14 5.14.0 5.14.1 5.14.2 5.15 5.15.0 5.15.1 5.15.2 5.4 5.5 5.6 5.7 5.8 5.9 5.9.8 6.0 6.0.0 6.1 6.1.0 6.1.1 6.1.2 6.1.3 6.2 6.2.0 6.2.1 6.2.2 wip/cmake wip/dbus wip/itemviews wip/nacl wip/new-backend wip/pointerhandler wip/propertycache-refactor wip/qquickdeliveryagent wip/scenegraphng wip/tizen wip/webassembly v5.15.0-alpha1 v5.14.1 v5.14.0 v5.14.0-rc2 v5.14.0-rc1 v5.14.0-beta3 v5.14.0-beta2 v5.14.0-beta1 v5.14.0-alpha1 v5.13.2 v5.13.1 v5.13.0 v5.13.0-rc3 v5.13.0-rc2 v5.13.0-rc1 v5.13.0-beta4 v5.13.0-beta3 v5.13.0-beta2 v5.13.0-beta1 v5.13.0-alpha1 v5.12.7 v5.12.6 v5.12.5 v5.12.4 v5.12.3 v5.12.2 v5.12.1 v5.12.0 v5.12.0-rc2 v5.12.0-rc1 v5.12.0-beta4 v5.12.0-beta3 v5.12.0-beta2 v5.12.0-beta1 v5.12.0-alpha1 v5.11.3 v5.11.2 v5.11.1 v5.11.0 v5.11.0-rc2 v5.11.0-rc1 v5.11.0-beta4 v5.11.0-beta3 v5.11.0-beta2 v5.11.0-beta1 v5.11.0-alpha1 v5.10.1 v5.10.0 v5.10.0-rc3 v5.10.0-rc2 v5.10.0-rc1 v5.10.0-beta4 v5.10.0-beta3 v5.10.0-beta2 v5.10.0-beta1 v5.10.0-alpha1 v5.9.9 v5.9.8 v5.9.7 v5.9.6 v5.9.5 v5.9.4 v5.9.3 v5.9.2 v5.9.1 v5.9.0 v5.9.0-rc2 v5.9.0-rc1 v5.9.0-beta4 v5.9.0-beta3 v5.9.0-beta2 v5.9.0-beta1 v5.9.0-alpha1 v5.8.0 v5.8.0-rc1 v5.8.0-beta1 v5.8.0-alpha1 v5.7.1 v5.7.0 v5.7.0-rc1 v5.7.0-beta1 v5.7.0-alpha1 v5.6.3 v5.6.2 v5.6.1 v5.6.1-1 v5.6.0 v5.6.0-rc1 v5.6.0-beta1 v5.6.0-alpha1 v5.5.1 v5.5.0 v5.5.0-rc1 v5.5.0-beta1 v5.5.0-alpha1 v5.4.2 v5.4.1 v5.4.0 v5.4.0-rc1 v5.4.0-beta1 v5.4.0-alpha1
No related merge requests found
Showing with 81 additions and 15 deletions
...@@ -49,7 +49,8 @@ ...@@ -49,7 +49,8 @@
MainWindow::MainWindow() MainWindow::MainWindow()
: m_currentView(0), : m_currentView(0),
m_currentRootObject(0) m_currentRootObject(0),
m_transparent(false)
{ {
QVBoxLayout *layout = new QVBoxLayout; QVBoxLayout *layout = new QVBoxLayout;
...@@ -57,11 +58,12 @@ MainWindow::MainWindow() ...@@ -57,11 +58,12 @@ MainWindow::MainWindow()
QVBoxLayout *vbox = new QVBoxLayout; QVBoxLayout *vbox = new QVBoxLayout;
m_radioView = new QRadioButton(tr("QQuickView in a window container (direct)")); m_radioView = new QRadioButton(tr("QQuickView in a window container (direct)"));
m_radioWidget = new QRadioButton(tr("QQuickWidget (indirect through framebuffer objects)")); m_radioWidget = new QRadioButton(tr("QQuickWidget (indirect through framebuffer objects)"));
vbox->addWidget(m_radioView);
vbox->addWidget(m_radioWidget); vbox->addWidget(m_radioWidget);
vbox->addWidget(m_radioView);
m_radioWidget->setChecked(true); m_radioWidget->setChecked(true);
connect(m_radioView, &QRadioButton::toggled, this, &MainWindow::updateView); m_state = Unknown;
connect(m_radioWidget, &QRadioButton::toggled, this, &MainWindow::updateView); connect(m_radioWidget, &QRadioButton::toggled, this, &MainWindow::updateView);
connect(m_radioView, &QRadioButton::toggled, this, &MainWindow::updateView);
groupBox->setLayout(vbox); groupBox->setLayout(vbox);
layout->addWidget(groupBox); layout->addWidget(groupBox);
...@@ -101,6 +103,11 @@ MainWindow::MainWindow() ...@@ -101,6 +103,11 @@ MainWindow::MainWindow()
connect(m_checkboxOverlayVisible, &QCheckBox::toggled, m_overlayLabel, &QWidget::setVisible); connect(m_checkboxOverlayVisible, &QCheckBox::toggled, m_overlayLabel, &QWidget::setVisible);
layout->addWidget(m_checkboxOverlayVisible); layout->addWidget(m_checkboxOverlayVisible);
m_checkboxTransparent = new QCheckBox(tr("Transparent background in QQuickWidget"));
connect(m_radioWidget, &QCheckBox::toggled, m_checkboxTransparent, &QWidget::setEnabled);
connect(m_checkboxTransparent, &QCheckBox::toggled, this, &MainWindow::onTransparentChanged);
layout->addWidget(m_checkboxTransparent);
setLayout(layout); setLayout(layout);
updateView(); updateView();
...@@ -127,29 +134,45 @@ void MainWindow::switchTo(QWidget *view) ...@@ -127,29 +134,45 @@ void MainWindow::switchTo(QWidget *view)
void MainWindow::updateView() void MainWindow::updateView()
{ {
QString text = m_currentRootObject
? m_currentRootObject->property("currentText").toString()
: QStringLiteral("Hello Qt");
QUrl source("qrc:qquickviewcomparison/test.qml");
QSurfaceFormat format; QSurfaceFormat format;
format.setDepthBufferSize(16); format.setDepthBufferSize(16);
format.setStencilBufferSize(8); format.setStencilBufferSize(8);
if (m_transparent)
format.setAlphaBufferSize(8);
if (m_checkboxMultiSample->isChecked()) if (m_checkboxMultiSample->isChecked())
format.setSamples(4); format.setSamples(4);
if (m_radioView->isChecked()) { State state = m_radioView->isChecked() ? UseWindow : UseWidget;
if (m_format == format && m_state == state)
return;
m_format = format;
m_state = state;
QString text = m_currentRootObject
? m_currentRootObject->property("currentText").toString()
: QStringLiteral("Hello Qt");
QUrl source("qrc:qquickviewcomparison/test.qml");
if (m_state == UseWindow) {
QQuickView *quickView = new QQuickView; QQuickView *quickView = new QQuickView;
quickView->setFormat(format); // m_transparent is not supported here since many systems have problems with semi-transparent child windows
quickView->setFormat(m_format);
quickView->setResizeMode(QQuickView::SizeRootObjectToView); quickView->setResizeMode(QQuickView::SizeRootObjectToView);
connect(quickView, &QQuickView::statusChanged, this, &MainWindow::onStatusChangedView); connect(quickView, &QQuickView::statusChanged, this, &MainWindow::onStatusChangedView);
connect(quickView, &QQuickView::sceneGraphError, this, &MainWindow::onSceneGraphError); connect(quickView, &QQuickView::sceneGraphError, this, &MainWindow::onSceneGraphError);
quickView->setSource(source); quickView->setSource(source);
m_currentRootObject = quickView->rootObject(); m_currentRootObject = quickView->rootObject();
switchTo(QWidget::createWindowContainer(quickView)); switchTo(QWidget::createWindowContainer(quickView));
} else { } else if (m_state == UseWidget) {
QQuickWidget *quickWidget = new QQuickWidget; QQuickWidget *quickWidget = new QQuickWidget;
quickWidget->setFormat(format); if (m_transparent) {
quickWidget->setClearColor(Qt::transparent);
quickWidget->setAttribute(Qt::WA_TranslucentBackground);
}
quickWidget->setFormat(m_format);
quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView); quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView);
connect(quickWidget, &QQuickWidget::statusChanged, this, &MainWindow::onStatusChangedWidget); connect(quickWidget, &QQuickWidget::statusChanged, this, &MainWindow::onStatusChangedWidget);
connect(quickWidget, &QQuickWidget::sceneGraphError, this, &MainWindow::onSceneGraphError); connect(quickWidget, &QQuickWidget::sceneGraphError, this, &MainWindow::onSceneGraphError);
...@@ -158,8 +181,11 @@ void MainWindow::updateView() ...@@ -158,8 +181,11 @@ void MainWindow::updateView()
switchTo(quickWidget); switchTo(quickWidget);
} }
m_currentRootObject->setProperty("currentText", text); if (m_currentRootObject) {
m_currentRootObject->setProperty("multisample", m_checkboxMultiSample->isChecked()); m_currentRootObject->setProperty("currentText", text);
m_currentRootObject->setProperty("multisample", m_checkboxMultiSample->isChecked());
m_currentRootObject->setProperty("color", QColor(m_transparent ? Qt::transparent : Qt::darkCyan));
}
m_overlayLabel->raise(); m_overlayLabel->raise();
} }
...@@ -214,3 +240,9 @@ void MainWindow::onSceneGraphError(QQuickWindow::SceneGraphError error, const QS ...@@ -214,3 +240,9 @@ void MainWindow::onSceneGraphError(QQuickWindow::SceneGraphError error, const QS
{ {
m_labelStatus->setText(tr("Scenegraph error %1: %2").arg(error).arg(message)); m_labelStatus->setText(tr("Scenegraph error %1: %2").arg(error).arg(message));
} }
void MainWindow::onTransparentChanged(bool enabled)
{
m_transparent = enabled;
updateView();
}
...@@ -57,11 +57,13 @@ public: ...@@ -57,11 +57,13 @@ public:
protected: protected:
void resizeEvent(QResizeEvent*); void resizeEvent(QResizeEvent*);
private slots: private slots:
void updateView(); void updateView();
void onStatusChangedView(QQuickView::Status status); void onStatusChangedView(QQuickView::Status status);
void onStatusChangedWidget(QQuickWidget::Status status); void onStatusChangedWidget(QQuickWidget::Status status);
void onSceneGraphError(QQuickWindow::SceneGraphError error, const QString &message); void onSceneGraphError(QQuickWindow::SceneGraphError error, const QString &message);
void onTransparentChanged(bool enabled);
private: private:
void switchTo(QWidget *view); void switchTo(QWidget *view);
...@@ -75,6 +77,18 @@ private: ...@@ -75,6 +77,18 @@ private:
QObject *m_currentRootObject; QObject *m_currentRootObject;
QLabel *m_overlayLabel; QLabel *m_overlayLabel;
QCheckBox *m_checkboxOverlayVisible; QCheckBox *m_checkboxOverlayVisible;
enum State {
Unknown,
UseWidget,
UseWindow
} m_state;
QSurfaceFormat m_format;
QCheckBox *m_checkboxTransparent;
bool m_transparent;
}; };
#endif #endif
...@@ -44,7 +44,6 @@ import fbitem 1.0 ...@@ -44,7 +44,6 @@ import fbitem 1.0
Rectangle { Rectangle {
id: root id: root
color: "lightBlue"
property alias currentText: edit.text property alias currentText: edit.text
property alias multisample: fbitem.multisample property alias multisample: fbitem.multisample
......
...@@ -1115,4 +1115,23 @@ QImage QQuickWidget::grabFramebuffer() const ...@@ -1115,4 +1115,23 @@ QImage QQuickWidget::grabFramebuffer() const
return const_cast<QQuickWidgetPrivate *>(d_func())->grabFramebuffer(); return const_cast<QQuickWidgetPrivate *>(d_func())->grabFramebuffer();
} }
/*!
Sets the clear \a color. By default this is an opaque color.
To get a semi- or fully transparent QQuickWidget, call this function with \a
color set to Qt::transparent and set the Qt::WA_TranslucentBackground widget
attribute.
\note The limitations for having widgets underneath visible that are described
in QOpenGLWidget::setFormat() apply also to QQuickWidget. In that case use
Qt::WA_AlwaysStackOnTop instead of Qt::WA_TranslucentBackground.
\sa QQuickWindow::setColor()
*/
void QQuickWidget::setClearColor(const QColor &color)
{
Q_D(QQuickWidget);
d->offscreenWindow->setColor(color);
}
QT_END_NAMESPACE QT_END_NAMESPACE
...@@ -96,6 +96,8 @@ public: ...@@ -96,6 +96,8 @@ public:
QImage grabFramebuffer() const; QImage grabFramebuffer() const;
void setClearColor(const QColor &color);
public Q_SLOTS: public Q_SLOTS:
void setSource(const QUrl&); void setSource(const QUrl&);
void setContent(const QUrl& url, QQmlComponent *component, QObject *item); void setContent(const QUrl& url, QQmlComponent *component, QObject *item);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment