QTreeView GroupBy Dict Key - PullRequest
       17

QTreeView GroupBy Dict Key

0 голосов
/ 04 октября 2019

Какой подход был бы гибким и хорошим, чтобы сделать так, чтобы, когда пользователь щелкает ключ GroupBy, он использовал действие, на которое нажали, чтобы сгруппировать элементы в моем дереве, как на рисунках до и после, показанных ниже?

Iувидеть эту функцию во многих приложениях, подобных TreeView, но не похоже, что pyside имеет встроенное решение для группировки в отличие от C #.

enter image description here

import os, sys, re
sys.path.append(os.environ.get('PS_SITEPACKAGES'))
from Qt import QtWidgets, QtGui, QtCore

items = [
    {'sex': 'male', 'age': 32, 'name': 'Kevin', 'color': 'green'},
    {'sex': 'male', 'age': 60, 'name': 'Michell', 'color': 'blue'},
    {'sex': 'female', 'age': 32, 'name': 'Amy', 'color': 'blue'},
    {'sex': 'male', 'age': 24, 'name': 'Katie', 'color': 'green'},
    {'sex': 'female', 'age': 16, 'name': 'Amanda', 'color': 'orange'},
    {'sex': 'female', 'age': 16, 'name': 'Jesse', 'color': 'yellow'},
    {'sex': 'female', 'age': 60, 'name': 'Cory', 'color': 'green'},
]

class CategoryView(QtWidgets.QWidget):

    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        self.resize(400,400)
        self.createMenus()

        self.itemModel = QtGui.QStandardItemModel()

        self.proxyModel = QtCore.QSortFilterProxyModel()
        self.proxyModel.setSourceModel(self.itemModel)

        self.uiTreeView = QtWidgets.QTreeView()
        self.uiTreeView.setModel(self.proxyModel)
        self.uiTreeView.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.uiTreeView.sortByColumn(0, QtCore.Qt.AscendingOrder)
        self.uiTreeView.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
        self.uiTreeView.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
        self.uiTreeView.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
        self.uiTreeView.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)

        self.layout = QtWidgets.QVBoxLayout()
        self.layout.addWidget(self.uiTreeView)
        self.setLayout(self.layout)

        self.uiTreeView.customContextMenuRequested.connect(self.slotOpenContextMenu)

        self.populate()


    def populate(self):
        self.itemModel.setHorizontalHeaderLabels(['Name', 'Age', 'Color'])
        parentItem = self.itemModel.invisibleRootItem()
        for x in items:
            c1 = QtGui.QStandardItem(str(x.get('sex')))
            c2 = QtGui.QStandardItem(str(x.get('age')))
            c3 = QtGui.QStandardItem(str(x.get('color')))
            parentItem.appendRow([c1,c2,c3])

    def createMenus(self):
        self.contextMenu = QtWidgets.QMenu('File', self)
        self.groupByMenu = QtWidgets.QMenu('Group By', self)
        self.contextMenu.addMenu(self.groupByMenu)

        keys = items[0].keys()
        for x in keys:
            act = QtWidgets.QAction(x, self)
            act.triggered.connect(self.clickedGroupByKey)
            self.groupByMenu.addAction(act)

    # Slots
    def slotOpenContextMenu(self):
        self.contextMenu.exec_(QtGui.QCursor.pos())


    def clickedGroupByKey(self):
        print self.sender()

def main():
    app = QtWidgets.QApplication(sys.argv)
    ex = CategoryView()
    ex.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    pass
    main()
...