Python pyQt MVC - 将对象传递给模型类

3
  1. How is it that self.model = MyTableModel(self, [User('Mary', '12345'), User('John', 'qwerty')], ['name', 'password']) can pass object instance User('Mary', '12345') to MyTableModel() when I don't see def __init__(self, parent, rows, columns) set up to take it? From what I know, rows and columns are arguments to take info from the widget object and not a outside non widget object.

  2. What does the last part ['name', 'password'] do when given to MyTableModel()?

  3. Actually, I want just one instance of User() and have the model class update User() object instance if the human changes the lineEdit widget. since "mary" and "12345" in self.model = MyTableModel(self, [User('Mary', '12345')] are hardcoded values, how do I use the values of the lineEdit widgets instead in User(parameter, parameter)?

    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_()
    
1个回答

0
  1. 当我看不到def __init__(self, parent, rows, columns)设置来接收对象实例User('Mary', '12345')时,为什么self.model = MyTableModel(self, [User('Mary', '12345'), User('John', 'qwerty')], ['name', 'password'])可以将其传递给MyTableModel()?据我所知,行和列是从小部件对象中获取信息的参数,而不是外部非小部件对象。

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

  1. 当传递给MyTableModel()时,最后一部分['name', 'password']是做什么用的?

MyTableModel使用它来知道应该使用哪些对象属性进行显示。

实际上,我只想要一个User()的实例,并且在人类更改lineEdit小部件时,让模型类更新User()对象实例。由于self.model = MyTableModel(self, [User('Mary', '12345')])中的"mary"和"12345"是硬编码值,我该如何使用lineEdit小部件的值来代替User(parameter, parameter)中的值?
如果您的模型正确实现了setData协议并为模型中的所有项目返回ItemIsEditable,则用户已经可以更改模型内部的值(或使用该模型的视图)。您不需要额外的输入或更改GUI来完成此操作。
(如果您只想知道如何获取QLineEdit的当前文本内容,那么可以使用text()方法)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接