刷新 QTreeView / QSortFilterProxyModel

2 投票
1 回答
2875 浏览
提问于 2025-04-16 07:17

大家好,

我写代码已经很多年了,但在PyQt方面还是有点生疏,所以请大家多多包涵我这个语法不太规范的问题;-)

我正在修改一个PyQt4(还有Qt)自带的示例程序,叫做“basicsortfiltermodel.pyw”,这个文件在“../examples/itemviews”目录下...

我添加了一个小的弹出菜单(我们称之为B.py),可以从基本排序的派生程序(我们称之为A.py)中启动。

我相信我正在正确地向QSortFilterProxyModel()添加新数据(也就是新记录)。(我这么认为是因为经过一番努力后,现在没有出现错误)但是我似乎无法让QTreeView刷新。 我查阅了Qt的类文档,还在谷歌上搜索了很多(看起来这是个常见问题,哈哈)...

我知道这有点不太优雅,但为了让它能工作(我认为优雅的部分可以以后再来)...在A.py的底部,我声明了一个全局变量“wX”,

global wX;

[...]
window = Window()
wX = Window()
window.setSourceModel(createMailModel(window))

这样当我稍后点击一个按钮时,就可以更方便地获取运行时“createMailModel”中的“parent”值。通过这个值我可以得到“model”的句柄...

    model = QtGui.QStandardItemModel(0, 17, WinX)

    addMail(model, "image",
                           "tabl00",
                            etc
                            etc)

总之,我觉得这应该是有效的....但是在通过addMail()添加新记录后,我似乎无法让self.proxyModel自己刷新..

我很确定这只是个新手的问题,哈哈....但有没有人能帮我指点一下,怎么才能让它正常工作呢?

非常感谢,

1 个回答

3

我觉得你需要把新项目添加到原始模型中,而不是代理模型。一旦你添加了项目,代理模型和视图会自动更新。下面的例子看看能不能帮到你:

import sys
from PyQt4 import QtGui

class MainForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainForm, self).__init__(parent)

        self.setMinimumSize(300, 400)

        self.model = QtGui.QStandardItemModel()
        self.sortModel = QtGui.QSortFilterProxyModel()
        self.sortModel.setSourceModel(self.model)

        parentItem = self.model.invisibleRootItem()
        parentItem.appendRow(QtGui.QStandardItem("3"))
        parentItem.appendRow(QtGui.QStandardItem("1"))
        parentItem.appendRow(QtGui.QStandardItem("4"))
        parentItem.appendRow(QtGui.QStandardItem("2"))

        self.view = QtGui.QListView(self)
        self.view.setModel(self.sortModel)
        self.view.setGeometry(0, 0, 200, 400) 

        self.button = QtGui.QPushButton("add items", self)
        self.button.move(200, 0)
        self.button.clicked.connect(self.on_button_clicked)

        self.layout = QtGui.QVBoxLayout(self.centralWidget())        
        self.layout.addWidget(self.view)
        self.layout.addWidget(self.button)

        self.sortModel.sort(0)

    def on_button_clicked(self):
        parentItem = self.model.invisibleRootItem()
        parentItem.appendRow(QtGui.QStandardItem("222"))
        parentItem.appendRow(QtGui.QStandardItem("333"))
        parentItem.appendRow(QtGui.QStandardItem("444"))

def main():
    app = QtGui.QApplication(sys.argv)
    form = MainForm()
    form.show()
    app.exec_()

if __name__ == '__main__':
    main()

希望这能帮到你,祝好!

撰写回答