This commit is contained in:
Андрей Дувакин 2025-01-07 17:59:29 +05:00
parent 42a4fe0539
commit 173e2dbfdb

View File

@ -14,17 +14,23 @@ class DepartmentGraph(QGraphicsView):
self.setScene(self.scene) self.setScene(self.scene)
with connect() as session: with connect() as session:
self.departments = session.query(Department).all() # Список департаментов с их иерархией self.departments = session.query(Department).all() # Список департаментов с их иерархией
self.nodes = {} self.nodes = {}
self.render_graph() self.render_graph()
def render_graph(self): def render_graph(self):
root_departments = [d for d in self.departments if d.parent_id is None] root_departments = [d for d in self.departments if d.parent_id is None]
x, y = 50, 50 # Начальные координаты
spacing = 2500 # Если один корневой элемент, оставить стандартное
x = 50 # Начальная координата X
y = 50 # Начальная координата Y
for root in root_departments: for root in root_departments:
self.add_department_node(root, x, y) self.add_department_node(root, x, y)
x += 200 # Расстояние между корневыми узлами x += spacing # Увеличиваем X для следующего корневого элемента
def add_department_node(self, department, x, y, parent_item=None): def add_department_node(self, department, x, y, parent_item=None, level=0):
# Создаем кнопку # Создаем кнопку
button = QPushButton(department.title) button = QPushButton(department.title)
proxy = QGraphicsProxyWidget() proxy = QGraphicsProxyWidget()
@ -45,9 +51,11 @@ class DepartmentGraph(QGraphicsView):
# Рекурсивно добавляем подразделы # Рекурсивно добавляем подразделы
child_departments = [d for d in self.departments if d.parent_id == department.id] child_departments = [d for d in self.departments if d.parent_id == department.id]
child_x = x - len(child_departments) * 100 // 2 child_x = x - len(child_departments) * 100 // 2
for child in child_departments: for index, child in enumerate(child_departments):
self.add_department_node(child, child_x, y + 100, proxy) # Чередуем высоту (шашечное расположение)
child_x += 200 offset_y = (index % 2) * 150 # Смещение по оси Y для чередования
self.add_department_node(child, child_x, y + 100 + offset_y, proxy, level + 1)
child_x += 150
if __name__ == "__main__": if __name__ == "__main__":