gpt4 book ai didi

python - PyQt:当自定义 QAbstractListModel 数据更改时如何更改 QComboBox 中的 currentIndex

转载 作者:行者123 更新时间:2023-12-02 06:32:40 26 4
gpt4 key购买 nike

我已经阅读了一些有关如何为 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

How can I notify the QComboBox that model data changed, and listen to that event to modify currentIndex accordingly?

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

我可能会修改 addLevel 方法以返回所添加项目的 QModelIndex,然后使用它来设置该项目的 currentIndex 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)

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

2

I used [begin|end]ResetModel because my entry should be an ordered sequence of integer. So I need to rebuild the data list completely once an item in the middle of the list have been removed. I don't know if this is the right way to go. Any better solution?

这要看情况。 [begin|end]ResetModel 用于真正的彻底改变。我不明白保留整数的有序列表会如何导致单个项目添加/删除的此类更改。根据您的描述,您应该使用 [begin|end]InsertRows[begin|end]RemoveRows

关于python - PyQt:当自定义 QAbstractListModel 数据更改时如何更改 QComboBox 中的 currentIndex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13587211/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com