2010-11-18 76 views
1

好日子所有,刷新QTreeView則/ QSortFilterProxyModel

一直在寫代碼了多年,但還是有點綠色的,當涉及到的PyQt, 所以請原諒我的語法缺乏問題(S);-)

我PyQt4中從 「../examples/itemviews」 黑客(出名?)封裝的例子, 帶有PyQt4的(和Qt)的衍生物,即 「basicsortfiltermodel.pyw」 ...

我添加了一個彈出式菜單(讓我們稱之爲B.py),可以啓動來自BasicSort-derivative的(我們稱之爲A.py)。

我相信我正在糾正向 QSortFilterProxyModel()添加新數據(新記錄)。 (我認爲這是因爲我現在沒有得到 任何錯誤,經過一番努力)但是我似乎無法讓QTreeView刷新 。我已經沖刷了Qt類文檔和 Google'd赫克出來的(好像從 一個常見的問題的外觀上來看,大聲笑)..

現在我知道這是一個醜陋的黑客攻擊,只是設法得到它的工作 (優雅以後能來是我的理論)... 在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刷新自己..

我很確定這是一個愚蠢的新手問題,大聲笑....但任何人都可以幫助揭示如何使這項工作?

非常感謝,

回答

2

我相信你必須添加新的項目到你原來的模型不是代理之一。一旦項目被添加代理模型並且視圖將相應地更新自己。看看下面的例子會爲你工作:

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

希望這會有所幫助,至於

+0

是的,它肯定不會......非常感謝你,塞爾! ;-) – Coleslaw 2010-11-21 20:01:55

+0

哎呦,...打回來很快...道歉... – Coleslaw 2010-11-23 02:40:01