我的QFileSystemModel在PyQt中没有按预期工作

时间:2010-04-17 13:15:41

标签: python qt pyqt qfilesystemmodel

EDIT2: model.hasChildren(parentIndex)返回True,但model.rowCount(parentIndex)返回0。 QFileSystemModel在PyQt中只是fubar吗?

编辑:如果我使用QDirModel,这一切都会完全正常。这是不推荐使用的,但可能QFileSystemModel还未在PyQt中完全实现?


我现在正在学习Qt模型/视图架构,而且我发现了一些不起作用的东西,正如我所期望的那样。我有以下代码(改编自Qt Model Classes):

from PyQt4 import QtCore, QtGui

model = QtGui.QFileSystemModel()

parentIndex = model.index(QtCore.QDir.currentPath())
print model.isDir(parentIndex) #prints True
print model.data(parentIndex).toString() #prints name of current directory

rows = model.rowCount(parentIndex)
print rows #prints 0 (even though the current directory has directory and file children)

问题:

这是PyQt的问题吗,我刚做错了什么,还是我完全误解了QFileSystemModel?根据文档,model.rowCount(parentIndex)应返回当前目录中的子项数。 (我在Ubuntu下用Python 2.6运行它)

QFileSystemModel文档说它需要一个Gui应用程序的实例,所以我也将上面的代码放在QWidget中,如下所示,但结果相同:

import sys
from PyQt4 import QtCore, QtGui

class Widget(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        model = QtGui.QFileSystemModel()

        parentIndex = model.index(QtCore.QDir.currentPath())
        print model.isDir(parentIndex)
        print model.data(parentIndex).toString()

        rows = model.rowCount(parentIndex)
        print rows


def main():
    app = QtGui.QApplication(sys.argv)
    widget = Widget()
    widget.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

2 个答案:

答案 0 :(得分:2)

我已经解决了。

使用QFileSystemModel而不是QDirModel的原因是因为QFileSystemModel在单独的线程中加载来自文件系统的数据。问题在于,如果你试图在构建它之后打印子数,那么它将不会加载孩子。修复上述代码的方法是添加以下内容:

self.timer = QtCore.QTimer(self)
self.timer.singleShot(1, self.printRowCount)

到构造函数的末尾,并添加一个printRowCount方法,该方法将打印正确数量的子项。呼。

答案 1 :(得分:1)

既然你已经弄明白了,只需要对模型的内容进行一些额外的考虑:QFileSystemModel :: rowCount返回visibleChildren集合中的行;我猜你正确地发现了问题:当你检查行数时,它还没有被填充。我没有使用计时器就改变了你的榜样;请检查它是否适合您:

class Widget(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.model = QtGui.QFileSystemModel()
        self.model.setRootPath(QtCore.QDir.currentPath())

    def checkParent(self):
        parentIndex = self.model.index(QtCore.QDir.currentPath())      

        print self.model.isDir(parentIndex)
        print self.model.data(parentIndex).toString()

        rows = self.model.rowCount(parentIndex)
        print "row count:", rows

def main():
    app = QtGui.QApplication(sys.argv)
    widget = Widget()
    widget.show()
    app.processEvents(QtCore.QEventLoop.AllEvents)  
    widget.checkParent()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

我相信你的代码应该在屏幕上显示构建小部件后的任何UI事件上正常工作

问候