Изменить данные модели из потоков в PyQt - PullRequest
0 голосов
/ 23 декабря 2018

У меня возникают проблемы при изменении исходной модели QSortFilterProxyModel из другого потока, в то время как прокси-модель подключена к представлению.Прокси-модель, кажется, добавляет «отображаемые» элементы к отображаемой модели, пустые элементы, с которыми невозможно взаимодействовать (очевидно)

Этот пример кода демонстрирует проблему, с которой я сталкиваюсь, сводится к базовомупример, где есть представление для каждой модели прокси и исходной модели:

from PySide2 import QtCore, QtGui, QtWidgets
import random


WordList = ["apples", "pears", "down", "stairs", "mother", "hubord", "isn't", "cupboard", "lemon", "tango", "apricot", "nuke"]

class Searcher(QtCore.QThread):
    def __init__(self, model):
        super(Searcher, self).__init__()
        self.model = model

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


def populateModel(model):
    for i in range(5):
        item1 = QtGui.QStandardItem()
        model.invisibleRootItem().appendRow(item1)
        majorWord = random.choice(WordList)
        item1.setData(majorWord, QtCore.Qt.DisplayRole)

        for i in range(random.randint(2, 8)):
            item2 = QtGui.QStandardItem()
            item1.appendRow(item2)
            item2.setData(os.path.join(majorWord, random.choice(WordList)), QtCore.Qt.DisplayRole)


if __name__ == '__main__':
    tv = QtWidgets.QTreeView()
    tv.setWindowTitle("Source Model, Threaded")
    tv.show()

    tv2 = QtWidgets.QTreeView()
    tv2.setWindowTitle("Proxy Model, Threaded")
    tv2.show()

    tv3 = QtWidgets.QTreeView()
    tv3.setWindowTitle("Proxy Model 2, No Threading")
    tv3.show()

    sourceModel = QtGui.QStandardItemModel()
    tv.setModel(sourceModel)

    proxyModel = QtCore.QSortFilterProxyModel()
    proxyModel.setDynamicSortFilter(True)
    proxyModel.setSourceModel(sourceModel)
    tv2.setModel(proxyModel)

    s = Searcher(sourceModel)
    s.start()

    sm3 = QtGui.QStandardItemModel()
    pm3 = QtCore.QSortFilterProxyModel()
    pm3.setSourceModel(sm3)
    proxyModel.setDynamicSortFilter(True)
    tv3.setModel(pm3)
    populateModel(sm3)

Я подумал, что, возможно, свойство setDynamicSortFilter модели прокси может быть полезным, но, похоже, оно не имелолюбой эффект.

Любая помощь или указатели приветствуются!

...