2013-05-28 45 views
3
  1. 它是如何self.model = MyTableModel(self, [User('Mary', '12345'), User('John', 'qwerty')], ['name', 'password'])可以通過 對象實例User('Mary', '12345')MyTableModel()當我做不 看到def __init__(self, parent, rows, columns)成立了以它? 據我所知,行和列是參數從 獲取窗口小部件對象的信息,而不是外部的非窗口小部件對象。Python的PyQt的MVC-傳遞對象到模型類

  2. 什麼是最後一部分['name', 'password']當給 做什麼MyTableModel()?

  3. 其實,我想()用戶的只有一個實例,並有模型 類更新用戶()對象實例如果人改變了 lineEdit部件。因爲「mary」和「12345」在self.model = MyTableModel(self,[User('Mary','12345')]是硬編碼值, 如何使用lineEdit小部件的值代替 User參數,參數)?

    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_() 
    

回答

0
  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. 其實,我想()用戶的只有一個實例,並有模型 類更新用戶()對象實例如果人改變了 lineEdit部件。因爲「mary」和「12345」在self.model = MyTableModel(self,[User('Mary','12345')]是硬編碼值, 如何使用lineEdit小部件的值代替 User參數,參數)?

當你的模型正確地實現了setData協議和模型中的所有項目,用戶已經可以更改值模型內(或使用該模型視圖返回ItemIsEditable) 。您不需要額外的輸入或更改GUI即可完成此操作。

(如果您只是想知道如何獲取QLineEdit的當前文本內容,那就是text()方法)

相關問題