Почему я не вижу зеленый прямоугольник в главном окне? - PullRequest
0 голосов
/ 20 мая 2018

Я могу попробовать использовать Qt и QML из Python.

main_window.qml:

import QtQuick 2.10

Rectangle {
  id: mainWindow
  objectName: "mainWindow"
  width: 1000
  height: 100
  x: 100
  y: 100
  color: "gray"

  Rectangle {
    id: red
    objectName: "red"
    width: 800
    height: 50
    x: 200
    y: 200
    color: "red"
  }
}

rectangle.qml:

import QtQuick 2.10

Rectangle {
  id: green
  objectName: "green"
  width: 800
  height: 50
  x: 200
  y: 400
  color: "green"
}

test.py:

import os
import sys

from PyQt5.QtCore import QUrl
from PyQt5.QtGui import QGuiApplication
from PyQt5.QtQml import QQmlComponent
from PyQt5.QtQuick import QQuickView

os.environ["QML_DISABLE_DISK_CACHE"] = "true"

class Graphic:
  def __init__(self):
    self.main_window = QQuickView()
    self.main_window.setSource(QUrl.fromLocalFile("ui/main_window.qml"))

  def load_screen(self):
    component = QQmlComponent(self.main_window.engine())
    component.loadUrl(QUrl.fromLocalFile("ui/rectangle.qml"))
    item = component.create()
    item.setParent(self.main_window.rootObject())

    self.main_window.show()

if __name__ == '__main__':
  app = QGuiApplication(sys.argv)
  graphic = Graphic()
  graphic.load_screen()
  app.exec()

Это простой пример для моего вопроса.Я пытаюсь динамически загружать и отображать экраны в главном окне.Я вижу серый и красный прямоугольник, но не вижу зеленый прямоугольник.Что не так?

1 Ответ

0 голосов
/ 20 мая 2018

Согласно документам :

parent: QQuickItem *

Это свойство содержит визуального родителя элемента.

Примечание : Концепция визуального родителя отличается от концепции родителя QObject.Визуальный родительский элемент не обязательно должен совпадать с родительским объектом.Для получения дополнительной информации смотрите Concepts - Visual Parent в Qt Quick.

Другими словами, чтобы элемент был видимым, визуальный родитель должен быть установлен через setParentItem():

def load_screen(self):
    component = QQmlComponent(self.main_window.engine())
    component.loadUrl(QUrl.fromLocalFile("ui/rectangle.qml"))
    item = component.create()
    item.setParent(self.main_window.rootObject())
    item.setParentItem(self.main_window.rootObject()) # <---
    self.main_window.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...