【问题标题】:refreshing QTreeView / QSortFilterProxyModel刷新 QTreeView / QSortFilterProxyModel
【发布时间】:2010-12-22 23:55:01
【问题描述】:

祝大家今天好,

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

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

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

我相信我正在更正将新数据(新记录)添加到 QSortFilterProxyModel()。 (我认为这是因为我没有得到 经过一番努力,现在有任何错误)但我似乎无法得到 要刷新的 QTreeView。我已经搜索了 Qt 类文档和 谷歌搞砸了(似乎是一个常见的问题 它的外观,大声笑)..

现在我知道这是一个丑陋的 hack,但只是为了让它发挥作用 (优雅可以稍后出现是我的理论)...... 在 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 刷新自己..

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

非常感谢,

【问题讨论】:

    标签: python qt pyqt


    【解决方案1】:

    我相信您必须将新项目添加到您的原始模型中,而不是代理模型中。添加项目后,代理模型和视图将相应地更新自己。看看下面的例子是否适合你:

    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()
    

    希望这会有所帮助,问候

    【讨论】:

    • 是的,确实如此!...非常感谢,Serge! ;-)
    猜你喜欢
    • 2015-06-16
    • 1970-01-01
    • 2018-04-02
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    相关资源
    最近更新 更多