无法在不中断堆叠顺序的情况下使QQuickWidget背景透明

时间:2017-01-17 11:42:51

标签: c++ qt qml qt5 qquickwidget

我在使QQuickWidget背景透明化时遇到问题。

我想在QQuickWidget下放置一个QWidgetQQuickWidget使用源qml文件。当我使用Qt 4.8时,我使用了QDeclarativeView。从Qt 4移植到Qt 5,不再使用QDeclarativeView。因此,我使用QQuickWidget代替QDeclarativeView,如下所示:

 QWidget *mainWidget = new QWidget();
 mainWidget->setStyleSheet("background-image: url(:/background.png);");

 QQuickWidget *quick = new QQuickWidget(mainWidget);
 quick->setAttribute(Qt::WA_TranslucentBackground, true);
 quick->setAttribute(Qt::WA_AlwaysStackOnTop, true);
 quick->setClearColor(Qt::transparent);
 quick->setSource(QUrl("qrc:/image.qml"));

 QWidget *topWidget = new QWidget(mainWidget);
 topWidget->setStyleSheet("background-image: url(:/semitransparent.png);");

如果我这样做:

setAttribute(Qt::WA_AlwaysStackOnTop, true);

然后背景变得透明,但打破了涉及同一窗口内QQuickWidget下面的其他小部件的堆叠顺序。

我希望QQuickWidget位于QWidget下面时为WA_AlwaysStackOnTop透明。这可能吗?如果没有,你建议做些什么变通方法?

(1)这是mainWidget的背景图片:

enter image description here

(2)这是QQuickWidget的背景。 qml文件使用此图片:

enter image description here

(3)这是topWidget的背景图片:

enter image description here

(4)我想要的:

enter image description here

(5)我将WA_AlwaysStackOnTop设为 false 时得到的结果:

enter image description here

(6)当我将 >>> def foo(): ... return [1,2,3] >>> def bar(): ... return [-1,0] + foo() >>> bar() [-1, 0, 1, 2, 3] 设为 true 时,我得到了什么:

enter image description here

2 个答案:

答案 0 :(得分:1)

这已经很老了,但是...

在许多情况下,除非将QML控件透明化而不破坏堆栈顺序,否则将QML控件嵌入到Qt Widgets应用程序中是没有用的。

我没有实现的解决方案,因为最后我不需要这样做。但是我正在解释我的方法,以防有人想尝试。

1)获取具有父背景的像素图:

void QuickRoomWidget::showEvent(QShowEvent *event) 
{
    QPoint p1 = mapTo(parentWidget(), QPoint(0, 0));
    QPixmap px = parent->grab(QRect(p1, size()));
}

2)使用QQuickImageProvider在QML内部传递图像:

https://doc.qt.io/qt-5/qquickimageprovider.html

https://doc.qt.io/qt-5/qtquick-imageprovider-example.html

3)让qml小部件的根项使用像素图绘制背景。

当然,这样做的性能不会很好,因此取决于您需要在哪里使用它可能不是一个选择。但就我而言,这不是问题。

如果有人尝试过,请告诉我它是否有效!

答案 1 :(得分:0)

此处的官方QT文档http://doc.qt.io/qt-5/qquickwidget.html表示可以预期中断堆叠顺序:

  

如果绝对必要,可以通过设置来克服此限制   QQuickWidget上的Qt :: WA_AlwaysStackOnTop属性。 请注意,   然而,这打破了堆叠顺序。例如,它不会   可以在QQuickWidget之上安装其他小部件,所以它   只应在半透明的情况下使用   需要在其下方显示其他小部件的QQuickWidget

另见官方博客文章:http://blog.qt.io/blog/2014/07/02/qt-weekly-16-qquickwidget/

最近的博客文章是针对QT 5.1中的新功能:http://www.ics.com/blog/combining-qt-widgets-and-qml-qwidgetcreatewindowcontainer

结论:您所看到的不是错误,而是QT框架的已知,公认和广告限制。

我的建议:不要尝试用黑客来解决这个问题,而是重新设计你的UI方法。例如,您可以使topWidget alpha-blend(半透明)。

编辑:例如,像这样:

enter image description here