Какой подход был бы гибким и хорошим, чтобы сделать так, чтобы, когда пользователь щелкает ключ GroupBy, он использовал действие, на которое нажали, чтобы сгруппировать элементы в моем дереве, как на рисунках до и после, показанных ниже?
Iувидеть эту функцию во многих приложениях, подобных TreeView, но не похоже, что pyside имеет встроенное решение для группировки в отличие от C #.
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()