我在使QQuickWidget
背景透明化时遇到问题。
我想在QQuickWidget
下放置一个QWidget
。 QQuickWidget
使用源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的背景图片:
(2)这是QQuickWidget的背景。 qml文件使用此图片:
(3)这是topWidget的背景图片:
(4)我想要的:
(5)我将WA_AlwaysStackOnTop
设为 false 时得到的结果:
(6)当我将 >>> def foo():
... return [1,2,3]
>>> def bar():
... return [-1,0] + foo()
>>> bar()
[-1, 0, 1, 2, 3]
设为 true 时,我得到了什么:
答案 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(半透明)。
编辑:例如,像这样: