假设我有以下课程:
class Person(object):
def __init__(self, attributes):
# Attributes is just a dictionary (string -> value)
self.attributes = attributes
def set_attribute(self, attribute, value):
self.attributes[attribute] = value
# Some other code which may cause the value of other attributes to change,
# or other attributes to be added or deleted too
现在我想创建一个简单形式的PyQt对话框,但它是动态生成的(以考虑可变数量的属性)。我这样做是通过在QDialog中创建一个QFormLayout并为Person对象的每个属性添加一行:
self.formLayout = QtWidgets.QFormLayout()
for attribute in self.person.attributes.keys():
label = QtWidgets.QLabel(self)
label.setText(attribute)
lineEdit = QtWidgets.QLineEdit(self)
lineEdit.textEdited['QString'].connect(self.onAttributeChanged)
# or use a checkbox instead of a line edit if the attribute is a boolean,
# combo box if it's an enum or similar, etc.
self.formLayout.addRow(label, lineEdit)
其中onAttributeChanged()
使用适当的属性和用户输入的新值调用self.person.set_attribute
。
现在负责使用用户的输入值更新模型,但我遇到的问题是当set_attribute
修改此人的其他属性时,如何更新视图 set_attribute
可以添加或删除其他属性,或更改其他属性的名称或值。到目前为止,我已经考虑过:
lineEdit
连接到onAttributeChanged
一样。据我所知,这意味着使用pyqtSignal
在Person类中创建表示属性名称的信号,并在修改名称时发出适当的信号。但是,我想保持我的Person类完整,并且不受任何Qt .emit()
调用。 (更不用说这仍然不能处理添加/删除属性的情况。)在PyQt中有一些处理这种动态形式的优雅方法吗?