Создание подгрупп в QTableWdiget или QTreeWidget
Я хочу сделать таблицу с подгруппами, которые можно будет сворачивать и разворачивать. К примеру есть список людей и их нужно распределить по специальностям. Я думаю можно создавать для каждой группы отдельную таблицу и тогда останется только добавить 'сворачивание' QTableWdiget, но в таком случае будет множество объектов (таблиц) и мне кажется это неверным.
Также я пробовала вариант с QTreeWidget, но мне не удалось вставить в него таблицы в виде элементов или найти примеры с такой реализацией. Я постаралась показать что требуется на примере одной таблицы.
Строки таблицы зелёного цвета по задумке должны быть заголовками подгрупп:
И при надобности их можно 'свернуть', то есть спрятать все строки в подгруппе:
Код для примера:
import sys
from PyQt5 import QtCore
from PyQt5.QtWidgets import *
positions = ['Бухгалтеры', 'Строители', 'Менеджеры']
humans = [
{'name': 'Maria Schlager', 'age': 24},
{'name': 'John Townsley', 'age': 56},
{'name': 'Jeremy Villella', 'age': 32}
]
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('MainWindow')
self.resize(450, 450)
self.tableWidget = QTableWidget()
self.tableWidget.setColumnCount(2)
table = self.tableWidget
header = table.horizontalHeader()
header.setSectionResizeMode(0, QHeaderView.Stretch)
header.setSectionResizeMode(1, QHeaderView.Stretch)
table.setHorizontalHeaderItem(0, QTableWidgetItem('Имя и фамилия'))
table.setHorizontalHeaderItem(1, QTableWidgetItem('Возраст'))
for p in positions:
row_position = table.rowCount()
table.insertRow(row_position)
table.setItem(row_position, 0, QTableWidgetItem('Специальность'))
table.setItem(row_position, 1, QTableWidgetItem(p))
table.item(row_position, 0).setBackground(QtCore.Qt.green)
table.item(row_position, 1).setBackground(QtCore.Qt.green)
for h in humans:
row_position = table.rowCount()
table.insertRow(row_position)
table.setItem(row_position, 0, QTableWidgetItem(h['name']))
table.setItem(row_position, 1, QTableWidgetItem(str(h['age'])))
self.layout = QVBoxLayout()
self.layout.addWidget(self.tableWidget)
self.setLayout(self.layout)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Window()
sys.exit(app.exec_())
Ответы (1 шт):
Я вам предложу вернуться к реализации задуманного вами через QTreeWidget.
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.centralwidget = QtWidgets.QWidget()
self.setCentralWidget(self.centralwidget)
self.treeWidget = QtWidgets.QTreeWidget(self.centralwidget)
self.treeWidget.setObjectName("treeWidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.addWidget(self.treeWidget)
positions = [
[
['Специальность', 'Бухгалтеры'],
[
['Maria Schlager', '24'],
['John Townsley', '56'],
['Jeremy Villella', '32'],
]
],
[['Специальность', 'Строители'],
[
['Стивенсон Томас', '203'],
['Игнатченко Евгений Афанасьевич', '115'],
]
],
[['Специальность', 'Менеджеры'], [['Афродита', '21'], ]],
]
self.treeWidget.setColumnCount(2)
self.treeWidget.setHeaderLabels(['Имя и фамилия', 'Возраст'])
self.treeWidget.itemClicked.connect(self.change_func)
for header, lines in positions:
preview = QtWidgets.QTreeWidgetItem(self.treeWidget)
self.treeWidget.addTopLevelItem(preview)
preview.setText(0, header[0])
preview.setText(1, header[1])
for line in lines:
preview.addChild(QtWidgets.QTreeWidgetItem(line))
self.treeWidget.expandAll()
def change_func(self, item, column):
print(column, item.text(column))
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.resize(600, 600)
w.show()
sys.exit(app.exec_())



