Мой QFileSystemModel не работает должным образом в PyQt - PullRequest
1 голос
/ 17 апреля 2010

EDIT2: model.hasChildren(parentIndex) возвращает True, но model.rowCount(parentIndex) возвращает 0.QFileSystemModel - просто fubar в PyQt?

EDIT: С некоторой адаптацией все это работает точно так же, как и должно, если я использую QDirModel.Это устарело, но, может быть, QFileSystemModel не была полностью реализована в PyQt?


В данный момент я изучаю архитектуру Qt Model / View и обнаружил, что что-то не работаеткак я и ожидал.У меня есть следующий код (адаптированный из Классы моделей Qt ):

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 говорится, что для этого требуется экземпляр приложения с графическим интерфейсом, поэтому я также поместил приведенный выше код в 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 ]

2 голосов
/ 17 апреля 2010

Я решил это.

Причина использования QFileSystemModel в отличие от QDirModel заключается в том, что QFileSystemModel загружает данные из файловой системы в отдельном потоке. Проблема в том, что если вы попытаетесь напечатать количество дочерних элементов сразу после того, как оно будет построено, это то, что он еще не загрузит дочерние элементы. Чтобы исправить вышеприведенный код, добавьте следующее:

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

в конец конструктора и добавьте метод printRowCount, который будет печатать правильное количество дочерних элементов. Уф.

1 голос
/ 17 апреля 2010

Поскольку вы уже поняли это, просто пара дополнительных мыслей о том, что происходит с вашей моделью: 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()

Я считаю, что ваш код должен корректно работать с любым событием пользовательского интерфейса после того, как созданный виджет отобразится на экране

привет

...