Hi all,

I just ran int this issue where I'm trying to fill a model via QRunnable, but when I do so, it seems to add extra rows for some mysterious reasons. If I run the respective process in in the main thread I get the expected results.
Can somebody please help?
Test code attached.

Cheers,
frank
from PySide import QtCore, QtGui

class AnalyseTask(QtCore.QRunnable):
    def __init__(self, model):
        super(AnalyseTask, self).__init__()
        self.model = model

    def run(self):
        process(self.model)

def process(path, model):
    path = '/tmp/exampleTree2'
    sub_dirs_dict = {}
    for cur_root, cur_dirs, cur_files in os.walk(path):
        if not model.rowCount():
            # first iteration - add item to model
            cur_root_item = QtGui.QStandardItem(cur_root)
            model.appendRow(cur_root_item)
        else:
            # subsequent iterations need to look up the item
            # from previous iterations through sub dirs
            try:
                for item in sub_dirs_dict[os.path.dirname(cur_root)]:
                    if item.data(QtCore.Qt.DisplayRole) == cur_root:
                        cur_root_item = item
                        # remove the item from the list
                        sub_dirs_dict[os.path.dirname(cur_root)].remove(item)
                        if not len(sub_dirs_dict):
                            # if no keys are left delete the dictionary
                            del sub_dirs_dict
            except KeyError:
                # reached leaf
                pass

        #### SUB DIRS ##########################################
        item_counter = 0
        sub_dirs_dict[cur_root] = []
        for d in cur_dirs:
            abs_path = os.path.join(cur_root, d)
            dir_item = QtGui.QStandardItem(abs_path)
            cur_root_item.setChild(item_counter, dir_item)
            sub_dirs_dict[cur_root].append(dir_item)
            item_counter += 1

        ##### FILES ##########################################
        for f in cur_files:
            file_item = QtGui.QStandardItem(os.path.join(cur_root, f))
            cur_root_item.setChild(item_counter, file_item)
            item_counter += 1        


if __name__ == '__main__':
    import sys
    import os
    app = QtGui.QApplication([])
   
    view = QtGui.QTreeView()
    model = QtGui.QStandardItemModel()   
    proxy = QtGui.QSortFilterProxyModel()
    proxy.setSourceModel(model)
    view.setModel(proxy)

    # If I run process() like this the model gets extra rows:
    task = AnalyseTask(model)
    QtCore.QThreadPool.globalInstance().start(task)
    
    # If I just run it in the main thread it wall works as expected:
    #process(model)

    view.show()
    view.expandAll()
    view.resize(800,600)
    view.raise_()
    sys.exit(app.exec_())
_______________________________________________
PySide mailing list
PySide@qt-project.org
http://lists.qt-project.org/mailman/listinfo/pyside

Reply via email to