2010-02-10 70 views
3

在下面的例子:PyQt的beginremoverows

from PyQt4 import QtCore, QtGui 

class Ui_Dialog(QtGui.QDialog): 

    def __init__(self,parent=None): 
     QtGui.QDialog.__init__(self,parent) 
     self.setObjectName("Dialog") 
     self.resize(600, 500) 

     self.model = QtGui.QDirModel() 
     self.tree = QtGui.QTreeView() 
     self.tree.setModel(self.model) 
     print(self.model.flags(self.model.index("c:\Program Files"))) 
     self.model.setFilter(QtCore.QDir.Dirs|QtCore.QDir.NoDotAndDotDot) 

     self.tree.setSortingEnabled(True) 

     self.tree.setRootIndex(self.model.index("c:\Program Files")) 

     #self.tree.hideColumn(1) 
     #self.tree.hideColumn(2) 
     #self.tree.hideColumn(3) 
     self.tree.setWindowTitle("Dir View") 
     self.tree.resize(400, 480) 
     self.tree.setColumnWidth(0,200) 

     self.tree.show() 
     QtCore.QObject.connect(self.tree, QtCore.SIGNAL("clicked(QModelIndex)"), self.test) 
     QtCore.QMetaObject.connectSlotsByName(self) 

     self.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8)) 

    def test(self,index): 

     print(self.model.filePath(index)) 

     print(self.model.rowCount(index)) 
     #self.model.beginRemoveRows(index.parent(),index.row(),self.model.rowCount(index)) 
     #self.model.endRemoveRows() 

     print("Row of the index =",index.row()) 

     print("Parent = ",self.model.data(index.parent())) 

if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    ui = Ui_Dialog() 
    #ui.show() 
    sys.exit(app.exec_()) 

我想刪除的行和它的孩子(如果有的話),當我點擊它。
(下點擊它的孩子文件夾都將被免職。)

我知道我在這條線會犯錯:

self.model.beginRemoveRows(index.parent(),index.row(),self.model.rowCount(index)) 

感謝您的時間。

+0

您能解釋上下文嗎?你是否刪除文件等? – PedroMorgan 2011-03-10 00:36:32

回答

3

我知道我在這行 犯錯:

self.model.beginRemoveRows(index.parent(),index.row(),self.model.rowCount(index)) 

是的,你說得對。讓我們來看看你傳遞什麼:

index.parent() - the parent of index 
index.row() - the row number of index, the row you want deleted 
self.model.rowCount(index) - the number of total children had by index 

現在,看看文檔中的圖片上beginRemoveRows

你告訴它你想從index.row()刪除該行等於孩子的數量有索引。你的父母子女指數不匹配。

你真正想要的是什麼:

beginRemoveRows(index.parent(), index.row(), index.row()) 

如果您在index.row()刪除行,所有的孩子都將被自動刪除

,還有一個更大的問題:beginRemoveRows()確實刪除任何行。它只是提醒你的模型,你將要刪除行。當你打電話給endRemoveRows()時,模型會讓任何聽到的人知道它已被更新,以便它們可以正確重繪。

在C++中,您將不會被允許調用beginRemoveRows(),因爲它們是隻有模型打算調用的受保護方法。

要進行過濾,您需要創建自定義代理模型(即QSortFilterProxyModel),以進行所需的過濾。然後,您將在信號處理程序中處理QSortFilterProxy模型作爲響應。

+0

感謝您回覆kaleb。它不工作..文件夾(在模型中)沒有被刪除,因爲它必須是..(它以其他順序刪除)..你可以在你的系統中檢查這個代碼..我不知道爲什麼發生這種情況? – Jeba 2010-02-10 22:51:31

+0

我剛剛添加了一個以「BUT」開頭的新部分,希望能夠解釋真正的問題(現在假設您發佈的代碼是完整的,而不僅僅是樣本)。 – 2010-02-11 01:02:14

+0

謝謝你再次回覆,並給出清晰的解釋..我完全是新的模型/視圖編程在這裏..你可以請張貼QSortFilterProxyModel的代碼片段,可以在這裏使用..因爲我沒有使用過這.. – Jeba 2010-02-11 04:38:59

0

Jebagnanadas - 我建議稍微改變你的設計;而不是使用UI作爲您的模型視圖,創建單獨的obects來表示TreeView中的內容,然後更新這些對象並重新生成/刷新您的TreeView。

你的test()方法應該從成員變量中刪除選定的對象,然後調用一個refresh()方法(需要編寫)來清除TreeView並使用更新後的成員變量重建它。

這個設計更好用,因爲它將用戶界面與模型分開,並且不必擔心處理更多的QT方法,所以必須使用該方法。

+0

非常感謝你的回覆。當我試着像你說的那樣,我在被刪除時意想不到的行爲! – Jeba 2010-02-14 14:27:14

+0

你的新代碼到目前爲止是什麼樣的? – 2010-02-15 14:02:27

+0

jcoon對不起回覆遲..我在樹視圖中使用setRowHidden()隱藏了選定的目錄,截至目前它看起來足夠了..感謝您花時間.. – Jeba 2010-03-18 07:14:53

0

感謝jcoon和kaleb ..我已經使用樹視圖中的setRowHidden()函數隱藏了行。