PyQt:当自定义QAbstractListModel数据改变时,如何在QComboBox中更改currentIndex

4

我已经阅读了一些关于如何为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可以监听,但我仍然没有找到如何做到这一点。
我的问题是:
1. 如何通知QComboBox模型数据已更改,并侦听该事件以相应地修改currentIndex? 2. 我使用[begin|end]ResetModel,因为我的条目应该是整数的有序序列。因此,一旦删除了列表中间的项,我需要完全重建数据列表。我不知道这是否是正确的方法。有更好的解决方案吗?
1个回答

3

1

如何通知QComboBox模型数据已更改,并侦听该事件以相应地修改currentIndex?

您无需从所做的事情中侦听事件。因为您自己添加东西,所以您知道模型数据何时更改。只需在添加数据后更改currentIndex即可。

我可能会修改addLevel方法来返回添加项的QModelIndex,然后使用它来设置QComboBoxcurrentIndex

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)

并且

newLevel = Level (self.levelListModel.rowCount() + 1)
newIndex = self.levelListModel.addLevel(newLevel)
self.ui.levelComboBox.setCurrentIndex(newIndex)

2

我使用了 [begin|end]ResetModel,因为我的条目应该是一个有序的整数序列。所以一旦列表中间的项目被删除,我需要完全重建数据列表。我不知道这是否是正确的方法。有更好的解决方案吗?

那就要看情况而定了。 [begin|end]ResetModel 适用于非常激烈的更改。我不明白为什么保持整数排序列表会导致单个项目添加/删除的如此剧烈更改。根据您的描述,您应该使用 [begin|end]InsertRows[begin|end]RemoveRows


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接