В одной папке 3 файла:
form.py
from __future__ import print_function
import sys, os
from PySide2.QtCore import QFile, QObject, QUrl
from PySide2.QtGui import QGuiApplication
from PySide2.QtQuick import QQuickView
if __name__ == '__main__':
app = QGuiApplication(sys.argv)
view = QQuickView()
view.setResizeMode(QQuickView.SizeRootObjectToView)
qmlFile = os.path.join(os.path.dirname(__file__), 'Main.qml')
view.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile)))
if view.status() == QQuickView.Error:
sys.exit(-1)
view.show()
app.exec_()
del view
Main.qml
import QtQuick 2.10
Item {
width: 200
height: 200
ListModel
{
id: myModel
ListElement { type: "Dog"; age: 8 }
ListElement { type: "Cat"; age: 5 }
}
ListView {
anchors.fill: parent
model: myModel
delegate: MyDelegate
}
}
MyDelegate.qml
import QtQuick 2.10
Component {
id: myDelegate
Text { text: type + ", " + age }
}
Запуск form.py должен дать мне окно с ListView и двумя элементами в нем. Этот код взят из официального руководства и изменен, поэтому я могу видеть, как работают ссылки на файлы QML в других файлах QML. Все, что я получаю, это белое окно, так что я думаю, что делегат не загружается Main.qml
.
Первая буква MyDelegate.qml
- заглавная, поэтому Main.qml
должен автоматически загрузить делегата. Я ожидаю, что это поведение, потому что это решение из вопроса: Включить другой файл QML из файла QML
и во многих руководствах, в том числе и по PyQt5, я видел, как они ссылаются на другие файлы QML.
Если я скопирую часть Component {...}
в Main.qml
и изменим ссылку на делегат в ListView {...}
с MyDelegate
на myDelegate
, это сработает.
Эта проблема возникает с любым узлом QML, который я хочу передать в отдельный файл.
Разве PySide2 не поддерживает эту функцию, или мне нужно сделать что-то магическое в form.py
, чтобы Main.qml
узнал, что есть другой файл QML для загрузки?
Я установил текущее колесо с
pip install --index-url=http://download.qt.io/snapshots/ci/pyside/5.11/latest/ pyside2 --trusted-host download.qt.io
из официальной вики на Windows 10 64-битной машине с установленным Python 3.6.