当我没有看到 设置来获取它时,它是如何
self.model = MyTableModel(self, [User('Mary', '12345'), User('John', 'qwerty')], ['name', 'password'])
传递对象实例的?据我所知,行和列是从小部件对象而不是外部非小部件对象获取信息的参数。User('Mary', '12345')
MyTableModel()
def __init__(self, parent, rows, columns)
最后一部分
['name', 'password']
在给 MyTableModel() 时做了什么?实际上,如果人类更改了 lineEdit 小部件,我只想要一个 User() 实例并让模型类更新 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_()
问问题
1070 次
1 回答
0
- 当我没有看到 设置来获取它时,它是如何
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 中的行和列。相反,行应该是一个对象列表,而列应该是一个字符串列表,表示模型实例应该展示的传递对象(在行参数中)的属性。
- 最后一部分
['name', 'password']
在给 MyTableModel() 时做了什么?
MyTableModel 使用它来了解对象的哪些属性应该用于显示。
- 实际上,如果人类更改了 lineEdit 小部件,我只想要一个 User() 实例并让模型类更新 User() 对象实例。由于 self.model = MyTableModel(self, [User('Mary', '12345')] 中的 "mary" 和 "12345" 是硬编码值,我如何在 User(parameter, parameter )?
当您的模型setData
正确实现协议并返回ItemIsEditable
模型中的所有项目时,用户已经可以更改模型内部的值(或使用该模型的视图)。您不需要额外的输入或更改 GUI 即可完成此操作。
(如果您只是想知道如何获取 QLineEdit 的当前文本内容,这就是text()
方法)
于 2013-05-31T23:38:44.760 回答