python 替换pyqt表模型中的所有数据

vatpfxk5  于 2023-04-28  发布在  Python
关注(0)|答案(2)|浏览(142)

我正在做一个游戏,涉及到移动“宝石”之间的存储银行和球员。我使用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的可用方法,似乎没有任何方法可以进行大规模更新。所有方法似乎都被设计为更新特定行和列的单个值。
我错过什么了吗?循环遍历数据并逐个更新项真的是唯一的选择吗?

laik7k3q

laik7k3q1#

表模型中用于更新数据的可用方法setData()旨在由视图使用,在该视图中,一次只能编辑一个基准面。但你不限于此。您可以编写任何您喜欢的方法来批量更新数据。只要确保它发出适当的dataChanged信号,这样视图就知道哪些数据发生了变化。

oalqel3c

oalqel3c2#

我终于找到了我在这里寻找的东西:PyQt5 Question about refreshing view/mode
一旦我发现可以为dataChanged信号提供一个范围,事情就变得容易多了。我只是向模型类中添加了一个方法,它接受更新的数据并发出一个dataChanged事件,其范围从左上角的单元格到右下角。最终的结果是这样的:

class TokenStoreModel( QtCore.QAbstractTableModel):

    def __init__(self, gems: list[ str, TokenStore], headers):
        super(TokenStoreModel, self).__init__()
        self._data = gems
        self._headers = headers

    def refreshData(self, gems):
        self._data = gems
        topLeft = self.createIndex(0,0)
        bottomRight = self.createIndex(len(gems), len(self._headers))
        self.dataChanged.emit(topLeft, bottomRight)

所以现在在我的控制器中,我可以简单地使用一个方法,如:

def refreshPlayerGems(self):
    data:list = [ ["Currently held", self.gameActions.currentPlayer.gems]]
    self._playerGemModel.refreshData( data)

在成功保存后调用。

相关问题