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()

モデルを my に設定しました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エントリは順序付けられた整数のシーケンスである必要があるため、使用しました。そのため、リストの途中にあるアイテムが削除されたら、データ リストを完全に再構築する必要があります。これが正しい方法かどうかはわかりません。より良い解決策はありますか?
4

1 に答える 1

3

1

モデル データが変更されたことを QComboBox に通知し、そのイベントをリッスンして currentIndex を適宜変更するにはどうすればよいですか?

やり方からイベントを聞く必要はありません。自分で追加するので、モデル データがいつ変更されるかがわかります。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

[begin|end]ResetModel を使用したのは、エントリが順序付けられた整数のシーケンスである必要があるためです。そのため、リストの途中にあるアイテムが削除されたら、データ リストを完全に再構築する必要があります。これが正しい方法かどうかはわかりません。より良い解決策はありますか?

場合によります。[begin|end]ResetModel本当に劇的な変化のためです。整数の順序付けられたリストを保持することが、単一項目の追加/削除のような変更にどのようにつながるかわかりません。あなたが説明したことから、 と を使用する必要が[begin|end]InsertRowsあり[begin|end]RemoveRowsます。

于 2012-11-27T22:47:56.220 に答える