PyQt

时间:2017-07-07 13:44:13

标签: forms pyqt5

假设我有以下课程:

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可以添加或删除其他属性,或更改其他属性的名称或值。到目前为止,我已经考虑过:

  1. 每当信息发生变化时,重建整个表单。可能还有比这更好的东西。
  2. 使用Qt信号/插槽模型,就像我将lineEdit连接到onAttributeChanged一样。据我所知,这意味着使用pyqtSignal在Person类中创建表示属性名称的信号,并在修改名称时发出适当的信号。但是,我想保持我的Person类完整,并且不受任何Qt .emit()调用。 (更不用说这仍然不能处理添加/删除属性的情况。)
  3. 完全抛弃表单并使用带有QStandardItemModel的表视图。不太理想,因为我真的想要表单而不是(为了更好的可用性)。
  4. 在PyQt中有一些处理这种动态形式的优雅方法吗?

0 个答案:

没有答案