我正在开发一款涉及在存储库和玩家之间移动“宝石”的游戏。我正在使用 QTableView 以 QAbstractTableModel 作为模型来显示播放器的当前宝石。当应用程序初始化时,我像这样设置模型:
def __init__(self, *args, obj=None, **kwargs):
QtWidgets.QMainWindow.__init__(self)
Ui_Widget.__init__(self)
self.setupUi(self)
self._headers = [Color.WHITE, Color.BLUE, Color.GREEN, Color.RED, Color.BLACK]
self.playerGemsTable = GemTableView(self.layoutWidget)
self.gameActions = GameActions(["p1", "p2", "p3", "p4"])
#populate the player gems table
data:list = [ ["Currently held", self.gameActions.currentPlayer.gems]]
self._playerGemModel = TokenStoreModel(data, self._headers, [0])
self.playerGemsTable.setModel(self._playerGemModel)
到目前为止,还不错。当我运行我的应用程序时,它会显示一个包含正确数据的表格。现在的问题是弄清楚如何更新模型。我不会改变个别项目。我正在调用 GameActions 类的一个方法来处理所有计算并更新所有宝石数量。我最初的想法是设置一个信号来响应成功的“保存”,然后将 _playerGemModel.data 设置为 self.gameActions.currentPlayer.gems 的新值。然而,查看 QAbstractTableModel 的可用方法,似乎没有任何方法可以进行批量更新。所有方法似乎都旨在更新特定行和列的单个值。
我错过了什么吗?遍历数据并逐项更新真的是唯一的选择吗?
表模型中用于更新数据的可用方法,
setData()
,旨在供视图使用,从那里您一次只能编辑一个数据。但你不仅限于此。您可以编写任何您喜欢的方法来批量更新数据。只需确保它发出适当的 dataChanged
信号,以便视图知道哪些数据已更改。