在下面的示例中:

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

谢谢你的时间。

最佳答案

我知道我搞错了
行:

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模型。

07-24 09:22