首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyQt:如何在自定义QAbstractListModel数据更改时在QComboBox中更改QAbstractListModel

PyQt:如何在自定义QAbstractListModel数据更改时在QComboBox中更改QAbstractListModel
EN

Stack Overflow用户
提问于 2012-11-27 15:13:12
回答 1查看 5.2K关注 0票数 4

我已经阅读了一些关于如何为QComboBox小部件定义自定义模型的示例。

下面是我如何定义我的模型:

代码语言:javascript
复制
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

代码语言:javascript
复制
self.levelListModel = LevelListModel()
self.ui.levelComboBox.setModel(self.levelListModel)

我以这种方式在列表中添加了一个模型:

代码语言:javascript
复制
newLevel = Level (self.levelListModel.rowCount() + 1)
self.levelListModel.addLevel(newLevel)

项目添加正确,我可以在组合框中看到它,但我希望将currentIndex更改为新项的索引。

我想QAbstractListModel可能会引发一些QComboBox可以倾听的事件,但我还没有找到如何去做。

我的问题是:

  1. 如何通知模型数据更改的QComboBox,并侦听该事件以相应地修改currentIndex?
  2. 我使用[begin|end]ResetModel,因为我的条目应该是一个有序的整数序列。因此,一旦删除了列表中间的项,我需要重新构建数据列表。我不知道这是不是正确的方法。有更好的解决办法吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-27 22:47:56

1

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

不需要从你做事的方式来听事件。您知道模型数据何时更改,因为您自己添加了一些内容。添加数据后,只需更改currentIndex即可。

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

代码语言:javascript
复制
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)

代码语言:javascript
复制
newLevel = Level (self.levelListModel.rowCount() + 1)
newIndex = self.levelListModel.addLevel(newLevel)
self.ui.levelComboBox.setCurrentIndex(newIndex)

2

我使用了,因为我的条目应该是一个有序的整数序列。因此,一旦删除了列表中间的项,我需要重新构建数据列表。我不知道这是不是正确的方法。有更好的解决办法吗?

这要看情况了。[begin|end]ResetModel是为了进行真正的重大变革。我不认为保留一个有序的整数列表会导致单项添加/删除这样的更改。根据您的描述,您应该使用[begin|end]InsertRows[begin|end]RemoveRows

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13587211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档