我在嘗試在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