在下面的示例中:
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模型。