2017-01-17 12 views
0

У меня проблема с созданием фона QQuickWidget.Невозможно сделать 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. Это возможно? Если нет, какие обходные пути вы предлагаете?

(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) Что я получаю, когда я установил WA_AlwaysStackOnTop, как истинный:

enter image description here

+0

Почему вы заботитесь ли QQuickWidget является прозрачным или нет, так как она находится в нижней части? Является ли это частично видимым, и вы хотите убедиться, что даже частично видимые части вообще не видны? – Sabuncu

+0

Я отредактировал ваш вопрос, но, пожалуйста, просмотрите эту часть: «включение других виджетов под QQuickWidget в том же окне». В исходном предложении не было глагола («fiil»), поэтому я экстраполировал значение на основе контекста. – Sabuncu

+0

Это поможет обеспечить скриншот, который показывает проблему, когда используется 'WA_AlwaysStackOnTop'. Предоставьте ссылку на захват экрана imgur, и я поставлю его в суть вопроса. – Sabuncu

ответ

0

Официальный 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/

Это последняя запись в блоге для функции, которая является новой в QT 5.1: http://www.ics.com/blog/combining-qt-widgets-and-qml-qwidgetcreatewindowcontainer

Заключения: То, что вы видите, это не ошибка, но известное, признанное, объявленное ограничение рамки QT.

Мой совет: не пытайтесь разрешить это с помощью взлома, но перепроектируйте свой подход к пользовательскому интерфейсу. Например, возможно, вы можете сделать topWidget альфа-смесь (полупрозрачная).

EDIT: Например, как это:

enter image description here

+0

Вы сделали это с помощью qt или это отредактированное изображение? –

+0

Это отредактированное изображение. – Sabuncu