我在尝试在PyQt中学习模型/视图时遇到了困难(请参阅此主题:Unable to inherit from QAbstractItemModel)。当我尝试添加映射分配时,我的应用程序正在挂起。这里是我的自定义数据模型类:QDataWidgetMapper.addMapping(...)导致应用程序挂起
class MyCustomDataModel(QAbstractItemModel):
def __init(self, parent = None):
super(MyCustomDataModel, self).__init__(parent)
self.parent = None
def rowCount(self, parent):
return 1
def data(self, index, role):
if not index.isValid():
return None
if role == Qt.DisplayRole or role == Qt.EditRole:
if index.column() == 0:
return self.parent.value0
elif index.column() == 1:
return self.parent.value1
elif index.column() == 1:
return self.parent.value2
def setData(self, index, value, role = Qt.EditRole):
if role == Qt.EditRole:
if index.column() == 0:
self.parent.value0 = value
elif index.column() == 1:
self.parent.value1 = value
elif index.column() == 2:
self.parent.value2 = value
self.dataChanged.emit(index, index)
下面是尝试使用数据模型的类。它包含了我想要映射到小部件变量:
class MyCustomType(AnotherCustomTypeThatInheritsQListWidgetItem):
def __init__(self, parent = None):
super(MyCustomType, self).__init__(parent)
# Some member data:
self.value0 = 0
self.value1 = 1
self.value2 = 2
# Instantiate a model:
self.dataModel = MyCustomDataModel()
self.dataModel.parent = self
我有一个包含三个QLineEdit的小部件的复合控件:
class MyCompositeWidget(QWidget):
def __init__(self, parent = None):
super(MyCompositeWidget, self).__init__(parent)
self.dataMapper = QDataWidgetMapper()
# Instantiate three line edits:
self.lineEdit1 = QLineEdit()
self.lineEdit2 = QLineEdit()
self.lineEdit3 = QLineEdit()
# Add widgets to layout, set layout, etc. Not shown but widgets display properly.
def Activate(self, anInstanceofMyCustomType):
self.dataMapper.setModel(anInstanceOfMyCustomType.dataModel)
self.dataMapper.addMapping(self.lineEdit1, 0) # This line causes application to hang indefinately
self.dataMapper.addMapping(self.lineEdit2, 1)
self.dataMapper.addMapping(self.lineEdit3, 2)
在运行时,应用程序挂起在指定的“addMapping”呼在“激活(...)”功能中。我发现网上的教程很不明确,并且在这里遇到了障碍。我不得不承认我对“index.column()”映射很困惑,但我相信这是如何将索引分配给数据成员。无论如何,任何帮助都非常感谢......我花了很多时间试图学习这一点,到目前为止没有任何真正的展示。
去这里的一种方法是删除所有不必要的东西,然后进一步简化代码,直到达到可行的状态。一个最小但完整的例子会帮助其他人调查问题。 – Trilarion