1

EDIT2: model.hasChildren(parentIndex)を返しますTrueが、をmodel.rowCount(parentIndex)返します0。QFileSystemModelはPyQtの単なるfubarですか?

編集:少し調整すれば、これはすべて、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)、現在のディレクトリ内の子の数を返す必要があります。(私はこれをPython 2.6を搭載したUbuntuで実行しています)

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

2 に答える 2

2

私はそれを解決しました。

QDirModel ではなく QFileSystemModel を使用する理由は、QFileSystemModel が別のスレッドでファイルシステムからデータをロードするためです。それに関する問題は、構築された直後に子の数を出力しようとすると、まだ子が読み込まれていないことです。上記のコードを修正する方法は、次を追加することです。

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

コンストラクターの最後に追加し、正しい数の子を出力する printRowCount メソッドを追加します。ふぅ。

于 2010-04-17T15:59:04.387 に答える
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()

構築されたウィジェットが画面に表示された後、コードはどの UI イベントでも正しく動作するはずです。

よろしく

于 2010-04-17T16:33:57.600 に答える