刷新 QTreeView / QSortFilterProxyModel
大家好,
我写代码已经很多年了,但在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()
希望这能帮到你,祝好!