首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使QQuickWidget背景透明而不破坏堆叠顺序

无法使QQuickWidget背景透明而不破坏堆叠顺序
EN

Stack Overflow用户
提问于 2017-01-17 11:42:51
回答 2查看 1.5K关注 0票数 2

我有一个问题,使QQuickWidget背景透明。

我想把一个QQuickWidget放在QWidget下面。QQuickWidget使用一个源qml文件。当我使用QT4.8时,我使用了QDeclarativeView。从Qt4移植到Qt5,不再使用QDeclarativeView。因此,我使用的是QQuickWidget而不是QDeclarativeView,如下所示:

代码语言:javascript
复制
 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);");

如果我这样做了:

代码语言:javascript
复制
setAttribute(Qt::WA_AlwaysStackOnTop, true);

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

QQuickWidgetQWidget下面时,我想使它透明。这个是可能的吗?如果没有,你有什么解决办法?

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

(2)这是QQuickWidget的背景。qml文件使用以下图像:

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

(4)我想要的:

(5)当我将WA_AlwaysStackOnTop设置为false时,我得到了什么

(6)当我将WA_AlwaysStackOnTop设置为true时,我得到了什么

EN

回答 2

Stack Overflow用户

发布于 2017-01-18 08:27:59

这里的正式QT文档http://doc.qt.io/qt-5/qquickwidget.html说,打破堆叠顺序是可以预期的:

当绝对必要时,可以通过在Qt::WA_AlwaysStackOnTop上设置QQuickWidget属性来克服这个限制。但是,要注意,这打破了堆叠顺序。例如,在QQuickWidget上不可能有其他小部件,所以它应该只在需要QQuickWidget的情况下使用,而在这种情况下,需要在下面显示其他小部件。

还请参阅以下官方博客条目:http://blog.qt.io/blog/2014/07/02/qt-weekly-16-qquickwidget/

最近这篇博客文章是针对QT5.1中的一个新特性:http://www.ics.com/blog/combining-qt-widgets-and-qml-qwidgetcreatewindowcontainer

结论:您所看到的不是一个bug,而是一个已知的、公认的、公开的QT框架的限制。

我的建议是:不要试图用黑客来解决这个问题,而是重新设计你的UI方法。例如,也许你可以让topWidgetα-混合(半透明)。

编辑:例如,如下所示:

票数 1
EN

Stack Overflow用户

发布于 2019-07-19 11:31:24

这很旧但是..。

在许多情况下,在Qt应用程序中嵌入QML小部件是无用的,除非您可以在不破坏堆栈顺序的情况下使其透明。

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

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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41696239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档