刷新QTreeView / QSortFilterProxyModel

时间:2010-11-18 19:35:43

标签: python qt pyqt

大家好日子,

多年来一直在编写代码,但在PyQt方面仍然有点绿色, 所以请原谅我在语法上缺乏的问题; - )

我正在攻击(着名的?)打包示例的衍生物 附带PyQt4(和Qt),即“basicsortfiltermodel.pyw” 来自PyQt4中的“../examples/itemviews”......

我添加了一个可以启动的小弹出菜单(让我们称之为B.py) 来自BasicSort衍生物(让我们称之为A.py)。

我相信我正在纠正添加新数据(新记录) QSortFilterProxyModel()。 (我想这是因为我没有得到 现在任何错误,经过一些努力)但我似乎无法得到 QTreeView刷新。我已经搜索过Qt类文档了 谷歌出了问题(似乎是一个常见的问题 它的外观,哈哈)..

现在我知道这是一个丑陋的黑客,但只是为了让它发挥作用 (以后的优雅可以来自我的理论)...... 在A.py的底部,我宣布了一个全局“wX”,

global wX;

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

因此,当我稍后按下按钮时,我可以更容易地抓住 在运行时“createMailModel”中找到的“父”值。 从中我得到了“模型”处理..

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

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

无论如何,......我认为这是有效的...... 但是在通过addMail()添加新记录之后,我似乎无法得到 self.proxyModel刷新自己..

我很确定这是一个愚蠢的新手问题,哈哈......但是任何人都可以 帮助阐明如何使这项工作?

非常感谢,

1 个答案:

答案 0 :(得分: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()

希望这有帮助,尊重