Не удалось отобразить TreeView в Python - PullRequest
2 голосов
/ 17 февраля 2020

Опробовать действительно простой TreeView элемент управления для Qt в Python, но по какой-то причине GUI просто пуст.

main.qml

import QtQuick 2.14
import QtQuick.Controls 2.14
import QtQuick.Controls 1.4 as OldControls

ApplicationWindow {
    visible: true
    title: qsTr("Simple Tree View")

    OldControls.TreeView {
        anchors.fill: parent
        model: simpleModel
        OldControls.TableViewColumn {
            role: "display"
            title: "Name"
            width: 100
        }
    }
}

main.py

import sys
from os.path import abspath, dirname, join

from PySide2.QtGui import QGuiApplication, QStandardItemModel, QStandardItem
from PySide2.QtQml import QQmlApplicationEngine


class SimpleTreeView(QStandardItemModel):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.setColumnCount(1)

        root = self.invisibleRootItem()
        group1 = QStandardItem("group1")
        group1.setText("group1")
        value1 = QStandardItem("value1")
        value1.setText("value1")
        group1.appendRow(value1)
        root.appendRow(group1)


if __name__ == '__main__':
    app = QGuiApplication(sys.argv)

    engine = QQmlApplicationEngine()
    qmlFile = join(dirname(__file__), 'main.qml')
    engine.rootContext().setContextProperty("simpleModel", SimpleTreeView())
    engine.load(abspath(qmlFile))

    if not engine.rootObjects():
        sys.exit(-1)

    sys.exit(app.exec_())

Выход в Linux

enter image description here

1 Ответ

2 голосов
/ 17 февраля 2020

Проблема в том, что поскольку объект SimpleTreeView не назначен переменной, он уничтожается, что можно проверить с помощью сигнала destroyed.

class SimpleTreeView(QStandardItemModel):
    def __init__(self, parent=None):
        super().__init__(parent)

        <b>self.destroyed.connect(lambda o : print("destroyed:", o))</b>
        # ...

Вывод:

destroyed: <PySide2.QtCore.QObject(0x56377cf050f0) at 0x7ffa20deac40>

Решение состоит в том, чтобы присвоить переменную этому объекту, чтобы жизненный цикл был больше:

qmlFile = join(dirname(__file__), 'main.qml')
<b>model = SimpleTreeView()</b>
engine.rootContext().setContextProperty("simpleModel", <b>model</b>)
# ...

enter image description here

...