【问题标题】:Python pyQt MVC- Passing Objects To The Model ClassPython pyQt MVC-将对象传递给模型类
【发布时间】:2013-05-28 10:04:19
【问题描述】:
  1. self.model = MyTableModel(self, [User('Mary', '12345'), User('John', 'qwerty')], ['name', 'password'])怎么能通过 对象实例 User('Mary', '12345')MyTableModel() 当我不 看def __init__(self, parent, rows, columns) 设置好了吗? 据我所知,行和列是从中获取信息的参数 小部件对象,而不是外部非小部件对象。

  2. 最后一部分 ['name', 'password'] 给 MyTableModel()?

  3. 实际上,我只想要一个 User() 实例并拥有模型 如果人类改变了类更新 User() 对象实例 lineEdit 小部件。因为 self.model 中的 "mary" 和 "12345" = MyTableModel(self, [User('Mary', '12345')] 是硬编码值,如何 我是否使用 lineEdit 小部件的值而不是 用户(参数,参数)?

    from PyQt4 import QtCore, QtGui
    import sys
    
    class User():
        def __init__(self, name, password):
            self.name = name
            self.password = password
    
    
    class MyTableModel(QtCore.QAbstractTableModel):
    
        def __init__(self, parent, rows, columns):
            super().__init__(parent)
            self.rows = rows
            self.columns = columns
    
        def columnCount(self, index):
            return len(self.columns)
    
        def rowCount(self, index):
            return len(self.rows)
    
        def data(self, index, role):
            if index.isValid():
                if (role == QtCore.Qt.DisplayRole) or (role == QtCore.Qt.EditRole):
                    attr_name = self.columns[index.column()]
                    row = self.rows[index.row()]
                    return getattr(row, attr_name)
    
        def flags(self, index):
            if not index.isValid():
                return QtCore.Qt.ItemIsEnabled
            else:
                return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable
    
        def setData(self, index, value, role=QtCore.Qt.EditRole):
            if index.isValid() and role == QtCore.Qt.EditRole:
                attr_name = self.columns[index.column()]
                row = self.rows[index.row()]
                setattr(row, attr_name, value)
    
    
    class MyWindow(QtGui.QWidget):
        def __init__(self):
            super(MyWindow, self).__init__()
            self.setLayout(QtGui.QFormLayout(self))
            self.user_edit = QtGui.QLineEdit(self)
            self.password_edit = QtGui.QLineEdit(self)
            self.mapper = QtGui.QDataWidgetMapper(self)
            self.model = MyTableModel(self, [User('Mary', '12345'), User('John', 'qwerty')], ['name', 'password'])
            self.mapper.setModel(self.model)
            self.mapper.addMapping(self.user_edit, 0)
            self.mapper.addMapping(self.password_edit, 1)
            self.mapper.toFirst()
    
            self.layout().addRow("User name:", self.user_edit)
            self.layout().addRow("Password:", self.password_edit)
    
            self.btnPrevious = QtGui.QPushButton("Previous", self)
            self.btnNext = QtGui.QPushButton("Next",self)
            self.layout().addWidget(self.btnPrevious)
            self.layout().addWidget(self.btnNext)
    
            self.btnPrevious.clicked.connect(self.mapper.toPrevious)
            self.btnNext.clicked.connect(self.mapper.toNext)
    
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        win = MyWindow()
        win.show()
        app.exec_()
    

【问题讨论】:

    标签: python model-view-controller pyqt


    【解决方案1】:
    1. self.model = MyTableModel(self, [User('Mary', '12345'), User('John', 'qwerty')], ['name', 'password'])怎么能通过 对象实例 User('Mary', '12345')MyTableModel() 当我不 看def __init__(self, parent, rows, columns) 设置好了吗? 据我所知,行和列是从中获取信息的参数 小部件对象,而不是外部非小部件对象。

    这里的参数不代表 Qt-MVC-sense 中的行和列。相反,行应该是一个对象列表,而列应该是一个字符串列表,表示模型实例应该展示的传递对象(在行参数中)的属性。

    1. 最后一部分['name', 'password'] 给 MyTableModel()?

    MyTableModel 使用它来了解对象的哪些属性应该用于显示。

    1. 实际上,我只想要一个 User() 实例并拥有模型 如果人类改变了类更新 User() 对象实例 lineEdit 小部件。因为 self.model 中的 "mary" 和 "12345" = MyTableModel(self, [User('Mary', '12345')] 是硬编码值,如何 我是否使用 lineEdit 小部件的值而不是 用户(参数,参数)?

    当您的模型正确实现setData 协议并为模型中的所有项目返回ItemIsEditable 时,用户已经可以更改模型内的值(或使用该模型的视图)。您不需要额外的输入或更改 GUI 即可完成此操作。

    (如果你只是想知道如何获取 QLineEdit 的当前文本内容,那就是 text() 方法)

    【讨论】:

      猜你喜欢
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多