У меня проблема с 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:
(2) Это фон QQuickWidget. qml файл использует это изображение:
(3) Это фоновое изображение topWidget:
(4) Что я хочу:
(5) Что я получу, когда установлю WA_AlwaysStackOnTop
как ложный:
(6) Что я получу, когда установлю WA_AlwaysStackOnTop
как правда:
Официальная документация 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
альфа-смесь (полупрозрачная).
РЕДАКТИРОВАТЬНапример, вот так:
Других решений пока нет …