【问题标题】:PyQt: How to change currentIndex in QComboBox when custom QAbstractListModel data changedPyQt:自定义 QAbstractListModel 数据更改时如何更改 QComboBox 中的 currentIndex
【发布时间】:2012-11-15 05:59:44
【问题描述】:

我已经阅读了一些关于如何为 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,因为我的条目应该是一个有序的整数序列。因此,一旦列表中间的项目被删除,我需要完全重建数据列表。我不知道这是否是正确的方法。有更好的解决方案吗?

【问题讨论】:

    标签: python qt model-view-controller pyqt qcombobox


    【解决方案1】:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      相关资源
      最近更新 更多