2

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

我想在 aQQuickWidget下放置 a QWidget。使用QQuickWidget源 qml 文件。当我使用 Qt 4.8 时,我使用了QDeclarativeView. QDeclarativeView不再使用从 Qt 4 到 Qt 5 的移植。因此,我使用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然后背景变得透明,但打破了涉及同一窗口内部其他小部件的堆叠顺序。

我想QQuickWidgetQWidget. 这可能吗?如果没有,您建议什么解决方法?

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

在此处输入图像描述

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

在此处输入图像描述

(3) 这是topWidget的背景图:

在此处输入图像描述

(4) 我想要什么:

在此处输入图像描述

(5) 当我设置WA_AlwaysStackOnTopfalse时我得到什么:

在此处输入图像描述

(6) 当我设置WA_AlwaysStackOnToptrue时我得到什么:

在此处输入图像描述

4

2 回答 2

1

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

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

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

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小部件的根项目使用像素图绘制背景。

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

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

于 2019-07-19T11:31:24.810 回答
1

此处的官方 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 框架的已知、公认、宣传的限制。

我的建议:不要试图通过 hack 来解决这个问题,而是重新设计你的 UI 方法。例如,也许您可​​以制作topWidgetalpha-blend(半透明)。

编辑:例如,像这样:

在此处输入图像描述

于 2017-01-18T08:27:59.103 回答