我已经阅读了一些关于如何为QComboBox
小部件定义自定义模型的示例。
以下是我定义模型的方式:
class LevelListModel(QAbstractListModel):
def __init__(self, parent=None, *args):
""" datain: a list where each item is a row
"""
QAbstractListModel.__init__(self, parent, *args)
self.levelList = []
def rowCount(self, parent=QModelIndex()):
return len(self.levelList)
def data(self, index, role):
if index.isValid() and role == Qt.DisplayRole:
return QVariant(index.row())
else:
return QVariant()
def addLevel(self,level):
self.beginResetModel()
self.levelList.append(level)
self.endResetModel()
我将模型设置为QComboBox
:
self.levelListModel = LevelListModel()
self.ui.levelComboBox.setModel(self.levelListModel)
我以这种方式将模型添加到我的列表中:
newLevel = Level (self.levelListModel.rowCount() + 1)
self.levelListModel.addLevel(newLevel)
项目添加正确,我可以在组合框中看到它,但我想将currentIndex更改为新项目的索引。
我猜QAbstractListModel
可能引发某些QComboBox
可以听到的事件,但我还没有找到如何做到这一点。
我的问题是:
QComboBox
模型数据已更改,并听取该事件以相应地修改currentIndex?[begin|end]ResetModel
,因为我的条目应该是整数的有序序列。因此,一旦删除了列表中间的项目,我需要完全重建数据列表。我不知道这是不是正确的方法。有更好的解决方案吗?答案 0 :(得分:2)
<强> 1 强>
如何通知QComboBox模型数据已更改,并收听 那个事件要相应地修改currentIndex吗?
不需要从你做事的方式来听事件。您在模型数据更改时知道,因为您自己添加内容。只需在添加数据后更改currentIndex
即可。
我可能会修改addLevel
方法以返回已添加项目的QModelIndex
,然后使用它来设置currentIndex
的{{1}}:
QComboBox
和
class LevelListModel(QAbstractListModel):
# [skipped]
def addLevel(self,level):
self.beginInsertRows(QModelIndex(), len(self.levelList), len(self.levelList))
self.levelList.append(level)
self.endInsertRows()
return self.index(len(self.levelList)-1)
<强> 2 强>
我使用了[begin | end] ResetModel,因为我的条目应该是有序的 整数序列。所以我需要完全重建数据列表 一旦列表中间的项目被删除。我不知道 如果这是正确的方法。有更好的解决方案吗?
这取决于。 newLevel = Level (self.levelListModel.rowCount() + 1)
newIndex = self.levelListModel.addLevel(newLevel)
self.ui.levelComboBox.setCurrentIndex(newIndex)
是真正的重大变化。我没有看到保持一个有序的整数列表会导致单个项目添加/删除的这种更改。根据您的描述,您应该使用[begin|end]ResetModel
和[begin|end]InsertRows
。