PyQt QSortProxyModel - Нужно ли отображать столбец для сортировки? - PullRequest
0 голосов
/ 03 ноября 2018

Я пытаюсь создать древовидное представление, в котором нижележащие узлы имеют много атрибутов (~ 9), и я изучал примеры PyQt5, поставляемые с примерами. Однако примеры и поисковые запросы не отвечают на мой следующий вопрос. Первая моя цель:

Я просто хочу дать представление о дереве через столбец имен узлов и хочу иметь возможность сортировки по различным атрибутам / столбцам. Я например пытался использовать

        myView.sortByColumn(8, QtCore.Qt.AscendingOrder)

сортировать по 8-му признаку моей модели

def data(self, index, role):
[...]
        elif index.column() == 8:

            return node.status
[...]

однако при отображении только первого столбца (имен узлов) в представлении

def columnCount(self, parent):
    """
    in: QModelIndex
    out: int
    """
    N = 1

    return N

не видит отсортированный результат на мой взгляд.

После изменения значения columnCount на 9 представление было отсортировано по 8-му столбцу в обмен на 8 столбцов, которые я не хотел видеть в своем представлении ...

Вам нужно отобразить столбец, чтобы иметь возможность сортировать по нему? Если нет, не могли бы вы дать объяснение или небольшой пример того, как это сделать?

1 Ответ

0 голосов
/ 03 ноября 2018

Я только что решил проблему, попробовав несколько вещей:

Оказывается, вы должны убедиться, что столбецCount N модели достаточно большой, s.t. столбец j может использоваться прокси-моделью для сортировки! То есть N> j.

Параметр columnCount пользовательской (!) Прокси-модели затем можно использовать для отображения нужного количества столбцов.

class MySortFilterProxyModel(QtCore.QSortFilterProxyModel):
    def __init__(self, parent=None):
        super(MySortFilterProxyModel, self).__init__(parent)

    def columnCount(self, parent=None):
        return 1

class MyTreeModel(QtCore.QAbstractItemModel):

    def __init__(self, root, parent=None):
        """
        in: Node, Qobject
        """

        super(MyTreeModel, self).__init__(parent)

        self._root = root
        self.parent = parent


    def columnCount(self, parent):
        """
        in: QModelIndex
        out: int
        """
        return 9

        [...]

Это, конечно, имеет смысл, как только вы вспомните, что прокси-модель "просматривает" модель, т.е. знает только столбцы, обнародованные моделью.

Надеюсь, это сэкономит кому-то еще несколько минут проб и ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...