3
  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() のインスタンスを 1 つだけ必要とし、人間が lineEdit ウィジェットを変更した場合に、モデル クラスが User() オブジェクト インスタンスを更新するようにします。self.model = MyTableModel(self, [User('Mary', '12345')] の "mary" と "12345" はハードコードされた値であるため、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_()
    
4

1 に答える 1

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 センスの行と列を表していません。むしろ、行はオブジェクトのリストであり、列は渡されたオブジェクト (行引数で) の属性を示す文字列のリストであり、モデル インスタンスによって表示される必要があります。

  1. ['name', 'password']MyTableModel() に与えられたとき、最後の部分は何をしますか?

MyTableModel はこれを使用して、オブジェクトのどの属性を表示に使用する必要があるかを認識します。

  1. 実際には、User() のインスタンスを 1 つだけ必要とし、人間が lineEdit ウィジェットを変更した場合に、モデル クラスが User() オブジェクト インスタンスを更新するようにします。self.model = MyTableModel(self, [User('Mary', '12345')] の "mary" と "12345" はハードコードされた値であるため、User(parameter, parameter )?

setDataモデルがプロトコルを適切に実装し、モデル内のすべてのアイテムを返すと、ユーザーはモデル(またはそのモデルを使用するビュー)内のItemIsEditable値を変更できます。これを実現するために、追加の入力や GUI の変更は必要ありません。

(QLineEdit の現在のテキスト コンテンツを取得する方法を知りたい場合は、それがtext()メソッドです)

于 2013-05-31T23:38:44.760 に答える