2010-04-17 4 views
1

EDIT2 :model.hasChildren(parentIndex) 반환 True하지만 model.rowCount(parentIndex) 반환 0. QFileSystemModel은 PyQt에서 fubar인가요?PyQt는 예상대로 내 QFileSystemModel이 작동하지 않습니다

EDIT : 약간의 수정을 통해 QDirModel을 사용할 경우이 모든 기능이 제대로 작동합니다. 이것은 더 이상 사용되지 않지만 QFileSystemModel이 PyQt에서 완전히 구현되지 않았을 수 있습니까?


저는 현재 Qt Model/View 아키텍처를 배우고 있으며 기대했던대로 작동하지 않는 것을 발견했습니다.

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) 

질문 : 나는 (Qt Model Classes에서 적응) 다음과 같은 코드를 가지고

이 PyQt는 문제가, 내가 그냥 뭔가 잘못 수행 한 또는 나는 완전히 오해 QFileSystemModel입니까? 설명서에 따르면 model.rowCount(parentIndex)은 현재 디렉토리에있는 자식 수를 반환해야합니다. (나는 이것을 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

나는 그것을 풀었다.

QFileSystemModel이 QDirModel과 반대되는 이유는 QFileSystemModel이 별도의 스레드에서 파일 시스템의 데이터를로드하기 때문입니다. 문제는 그것이 생성 된 직후에 많은 수의 자식을 인쇄하려고하면 아직 자식을로드하지 않았다는 것입니다. 생성자의 마지막에

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

, 어린이의 정확한 숫자를 인쇄하는 printRowCount 방법을 추가 : 위의 코드를 수정하는 방법은 다음과 같은 추가하는 것입니다. 휴.

1

이미 알아 냈으므로 QFileSystemModel :: rowCount는 visibleChildren 컬렉션에서 행을 반환합니다. 나는 당신이 문제를 정확하게 확인했다고 생각한다 : 당신이 행 수를 확인하고있을 때 아직 채워지지 않았다. 타이머를 사용하지 않고 예제를 변경했습니다. PLS, 당신을 위해 작동하는지 확인하십시오

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

나는 위젯 구성이 화면에

관련 대답에 대한

+0

감사를 표시 한 후 코드가 어떤 UI 이벤트에 제대로 작동합니다 생각합니다. 예, processEvents()를 추가하면 타이머없이 동일한 결과를 얻을 수 있습니다. – Skilldrick

관련 문제