Pyside2:使用属性更新 QML TableView 模型

Posted

技术标签:

【中文标题】Pyside2:使用属性更新 QML TableView 模型【英文标题】:Pyside2 : Update QML TableView Model using Property 【发布时间】:2021-11-14 12:54:04 【问题描述】:

我有一个名为 Manager 的 python 类,它是这样注册的:

backend = Manager()
engine = QQmlApplicationEngine()
engine.rootContext().setContextProperty("backend", backend)

在这个类(经理)中,我还有一个名为 paramDs 的属性:

from PySide2.QtCore import QObject, Signal, Property, Slot

class Manager(QObject):
    processResult = Signal(bool)

    def __init__(self):
        QObject.__init__(self)
        self.ds = "loading .."

    @Slot()
    def start_processing(self):
        self.set_ds("500")

    def read_ds(self):
        return self.ds

    def set_ds(self, val):
        self.ds = val

    paramDs = Property(str, read_ds, set_ds)

在我的 qml 中我也有一个表格视图:

    import QtQuick 2.14
    import Qt.labs.qmlmodels 1.0
    TableView 
        id:tb
        anchors.fill: parent
        columnSpacing: 1
        rowSpacing: 1
        clip: true
    
        model: TableModel 
            TableModelColumn  display: "param_name" 
            TableModelColumn  display: "value" 
    
            rows: [
                
                    "param_name": "Param",
                    "value": "Value"
                ,
                
                    "param_name": "number of classes",
                    "value": backend.paramDs
                
            ]
        
    
        delegate: Rectangle 
            implicitWidth: displayer.width + 50 <100 ? 100 :displayer.width+50
            implicitHeight: 50
            color : "#aa009688"
    
            Text 
                id:displayer
                text: display
                color : "white"
                anchors.centerIn: parent
            
        
    

现在我在 qml 的某个地方调用 start_processing() slot 。 现在 paramDs 应该在表格视图中从“loading ..”更改为“500”,但它仍然是旧的“loading ..”值。

为什么属性不会在 qml 中自行更新?

【问题讨论】:

【参考方案1】:

如果您正在创建绑定,则该属性必须是可通知的,即具有关联的信号并在其更改时发出它:

class Manager(QObject):
    processResult = Signal(bool)
    df_changed = Signal()

    def __init__(self):
        QObject.__init__(self)
        self.ds = "loading .."

    @Slot()
    def start_processing(self):
        self.set_ds("500")

    def read_ds(self):
        return self.ds

    def set_ds(self, val):
        self.ds = val
        self.df_changed.emit()

    paramDs = Property(str, read_ds, set_ds, notify=df_changed)

【讨论】:

【参考方案2】:

你应该在设置属性后设置 Row 值,像这样:

        tbModel.setRow(1,
            
                param_name: "number of classes",
                value: backend.paramDs
            
        )

tbModel 是您的 Table View 模型的 ID

【讨论】:

以上是关于Pyside2:使用属性更新 QML TableView 模型的主要内容,如果未能解决你的问题,请参考以下文章

PySide2 + QML:QApplication:通过了无效的样式覆盖,忽略它

使用 PySide2 将 python 信号连接到 QML ui 插槽

将 QML 信号连接到 PySide2 插槽

PySide2 QML - 如何在另一个 QML 文件中引用 QML 文件作为组件?

PySide2/QML 填充和动画 Gridview 模型/委托

是否可以通过 QML 从 PySide2 插槽(服务调用)获取对象列表?