我正在做一个游戏,涉及到移动“宝石”之间的存储银行和球员。我使用QTableView显示播放器的当前gem,并使用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。数据与新的自我值。gameActions.currentPlayer。然而,看看QAbstractTableModel的可用方法,似乎没有任何方法可以进行大规模更新。所有方法似乎都被设计为更新特定行和列的单个值。
我错过什么了吗?循环遍历数据并逐个更新项真的是唯一的选择吗?
2条答案
按热度按时间laik7k3q1#
表模型中用于更新数据的可用方法
setData()
旨在由视图使用,在该视图中,一次只能编辑一个基准面。但你不限于此。您可以编写任何您喜欢的方法来批量更新数据。只要确保它发出适当的dataChanged
信号,这样视图就知道哪些数据发生了变化。oalqel3c2#
我终于找到了我在这里寻找的东西:PyQt5 Question about refreshing view/mode
一旦我发现可以为dataChanged信号提供一个范围,事情就变得容易多了。我只是向模型类中添加了一个方法,它接受更新的数据并发出一个dataChanged事件,其范围从左上角的单元格到右下角。最终的结果是这样的:
所以现在在我的控制器中,我可以简单地使用一个方法,如:
在成功保存后调用。