python - 刷新 QTreeView/QSortFilterProxyModel

标签 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 刷新自身..

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

非常感谢,

最佳答案

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

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

希望这有帮助,问候

关于python - 刷新 QTreeView/QSortFilterProxyModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4218778/

相关文章:

linux - cmake qt6 static ubuntu : libicuuc. so.66:添加符号时出错:命令行中缺少 DSO

python - QtiPlot 和 Python : global name 'QLocale' is not defined

python - 合并 reportlab 表中的列

python - 根据不同数据框中的匹配值将摘要列添加到 Pandas 数据框中

python - 来自 QFontDatabase 的令人困惑的行为

c++ - 在类中初始化QHash

python - PyQt Tableview 背景颜色基于数值?

python - 在 PyQt 应用程序中 pickle 一个字典

python - 当需要高精度时,Matplotlib 无法正确绘图

python - 下载 HTML 页面及其内容