【问题标题】:Can't pass a QAbstractListModel to QML无法将 QAbstractListModel 传递给 QML
【发布时间】:2014-05-18 06:51:00
【问题描述】:

我正在使用 PyQt5 尽可能接近地关注 this PySide tutorial。当我运行我的代码时,我收到了这个错误:ReferenceError: pythonListModel is not defined,并且列表显示为黑色,没有任何项目。

这是我的代码

def main():
    platform = Platform("Windows")
    platform_wrp = qml_platforms.PlatformsWrapper(platform)
    platform_model = qml_platforms.PlatformsListModel([platform_wrp])
    app = QGuiApplication(sys.argv)
    engine = QQmlApplicationEngine(QUrl("main.qml"))
    context = engine.rootContext()
    context.setContextProperty('pythonListModel', platform_model)
    window = engine.rootObjects()[0]
    window.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

我的模型和包装器

class PlatformsWrapper(QObject):
    def __init__(self, platform):
        QObject.__init__(self)
        self.platform = platform
    def full_name(self):
        return str(self.platform.full_name)
    changed = pyqtSignal()
    full_name = pyqtProperty("QString", _full_name, notify=changed)

class PlatformsListModel(QAbstractListModel):
     def __init__(self, platforms):
        QAbstractListModel.__init__(self)
        self.platforms = platforms
     def rowCount(self, parent=QModelIndex()):
         return len(self.platforms)
     def data(self, index):
         if index.isValid():
             return self.platforms[index.row()]
         return None

还有我的 QML

import QtQuick 2.1
import QtQuick.Controls 1.1

ApplicationWindow{
ListView {
    id: pythonList
    width: 400
    height: 200

    model: pythonListModel

    delegate: Component {
        Rectangle {
            width: pythonList.width
            height: 40
            color: ((index % 2 == 0)?"#222":"#111")
            Text {
                id: title
                elide: Text.ElideRight
                text: model.platform.full_name
                color: "white"
                font.bold: true
                anchors.leftMargin: 10
                anchors.fill: parent
                verticalAlignment: Text.AlignVCenter
            }
            MouseArea {
                anchors.fill: parent
            }
        }
    }
}
}

为什么 Qt 找不到我的 contextProperty?

【问题讨论】:

    标签: python qt qml pyqt5 qabstractlistmodel


    【解决方案1】:

    问题是在设置上下文属性之前加载了“main.qml”。设置上下文后尝试加载文件:

    def main():
        platform = Platform("Windows")
        platform_wrp = qml_platforms.PlatformsWrapper(platform)
        platform_model = qml_platforms.PlatformsListModel([platform_wrp])
        app = QGuiApplication(sys.argv)
        engine = QQmlApplicationEngine()
        context = engine.rootContext()
        context.setContextProperty('pythonListModel', platform_model)
        engine.load( QUrl("main.qml") ) #load after context setup
        window = engine.rootObjects()[0]
        window.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • 谢谢,这摆脱了ReferenceError,但现在我得到了TypeError: Cannot read property 'full_name' of undefined。似乎由于某种原因无法读取该属性
    • 进行了大量的谷歌搜索,但我设法找到了如何使用 PyQt5 分配角色,在一个不相关的 SO 答案中发现:stackoverflow.com/questions/15306872/…
    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 2023-04-09
    • 2020-02-05
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    相关资源
    最近更新 更多