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 插槽
PySide2 QML - 如何在另一个 QML 文件中引用 QML 文件作为组件?