PySide2 QML - Как ссылаться на файл QML внутри другого файла QML как на компонент? - PullRequest
0 голосов
/ 27 июня 2018

В одной папке 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.

1 Ответ

0 голосов
/ 28 июня 2018

Спасибо derM и eyllanesc, которые указали на опечатку в ссылке MyDelegate.qml. Ссылка должна быть с фигурными скобками delegate: MyDelegate {}.

Теперь правильный form.py:

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 {}
    }
}

Он даже работает с myModel, переданным на аутсорсинг в MyModel.qml и именуемым model: MyModel {}

...