سؤال

EDIT2: model.hasChildren(parentIndex) عائدات True, ، لكن model.rowCount(parentIndex) عائدات 0. هل QFILESYSTEMMODEL فقط fubar في pyqt؟

تعديل: مع القليل من التكيف ، كل هذا يعمل تمامًا كما ينبغي إذا استخدمت QDirmodel. تم إهمال هذا ، ولكن ربما لم يتم تنفيذ QFILESYSTEMMODEL بالكامل في PYQT؟


أتعلم بنية نموذج QT/عرض في الوقت الحالي ، وقد وجدت شيئًا لا يعمل كما كنت أتوقعه. لقد حصلت على الرمز التالي (مقتبس من فئات نموذج 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) يجب إعادة عدد الأطفال في الدليل الحالي. (أنا أقوم بتشغيل هذا تحت أوبونتو مع بيثون 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()
هل كانت مفيدة؟

المحلول

لقد قمت بحلها.

سبب استخدام QFILESYSTEMMODEL بدلاً من QDIRMODEL هو أن QFILESYSTEMMODEL يقوم بتحميل البيانات من نظام الملفات في مؤشر ترابط منفصل. المشكلة في ذلك هي أنه إذا حاولت طباعة عدد الأطفال بعد أن تم بناؤه مباشرة ، فهي لن تقوم بتحميل الأطفال بعد. طريقة إصلاح الرمز أعلاه هي إضافة ما يلي:

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

إلى نهاية المنشئ ، وأضف طريقة printrowCount التي ستطبع العدد الصحيح من الأطفال. فيو.

نصائح أخرى

نظرًا لأنك اكتشفت ذلك بالفعل ، فإن بعض الأفكار الإضافية حول ما كان يجري مع نموذجك: QFILESYSTEMMODEL :: ROWCOUNT يعيد صفوف من مجموعة VISIBLECHILDRN ؛ أعتقد أنك حددت المشكلة بشكل صحيح: في الوقت الذي تقوم فيه بالتحقق من عدد الصفوف ، لم يتم ملؤها بعد. لقد غيرت مثالك دون استخدام أجهزة ضبط الوقت ؛ من فضلك ، تحقق مما إذا كان يعمل من أجلك:

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

أعتقد أن الكود الخاص بك يجب أن يعمل بشكل صحيح على أي حدث واجهة المستخدم بعد عرض عنصر واجهة المستخدم على الشاشة

مع تحياتي

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top