2012-11-27 58 views
2

我已閱讀了一些關於如何爲QComboBox小部件定義自定義模型的示例。PyQt:當QAbstractListModel數據發生變化時,如何更改QComboBox中的currentIndex

以下是我定義我的模型:

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. 我怎麼能通知模型數據變化,並聽取該事件相應地修改CURRENTINDEX的QComboBox
  2. 我用[begin|end]ResetModel因爲我的入口應該是一個有序的整數序列。所以我需要在列表中間的一個項目被刪除後完全重建數據列表。我不知道這是否正確。有更好的解決方案

回答

2

我怎樣才能通知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) 

我使用[begin | end] ResetModel,因爲我的條目應該是有序的 整數序列。因此,一旦清單中間的項目被刪除,我需要完全重建數據清單 。我不知道 如果這是正確的路要走。有更好的解決方案

那要看情況。[begin|end]ResetModel是真正激烈的變化。我不明白如何保留有序的整數列表會導致單個項目添加/刪除的變化。從你所描述的,你應該使用[begin|end]InsertRows[begin|end]RemoveRows

相關問題