From 3be7052b0a3d18eb7a7da4a4b27604320e4c4776 Mon Sep 17 00:00:00 2001 From: Egor Deev Date: Mon, 5 Oct 2026 17:35:37 +0000 Subject: [PATCH] =?UTF-8?q?=D0=A2=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=8B:=20?= =?UTF-8?q?=D1=81=D0=BE=D1=80=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=BA=D0=BB=D1=8E=D1=87=D0=B0=D0=B5=D1=82=D1=81?= =?UTF-8?q?=D1=8F=20=D0=BD=D0=B0=20=D0=B2=D1=80=D0=B5=D0=BC=D1=8F=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit QTableWidget с включённой сортировкой переставлял строки прямо во время заполнения: после сортировки по столбцу и обновления данные и кнопки «Редактировать/Цены/Удалить» могли оказаться в разных строках — действие применялось к чужой записи. Исправлено в таблицах компаний, моделей и цен (и в копии для exe). --- main_window.py | 18 ++++++++++++++++++ scripts/exe/mobile_devices.py | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/main_window.py b/main_window.py index a9c7ed7..4ff8002 100644 --- a/main_window.py +++ b/main_window.py @@ -189,6 +189,9 @@ class PriceDialog(QDialog): def load_prices(self): """Загрузка цен из БД""" prices = self.db.get_model_prices(self.model_id) + # При включённой сортировке строки переставляются прямо во время заполнения, + # и кнопки строки оказываются привязаны к чужим записям — выключаем её на время + self.prices_table.setSortingEnabled(False) self.prices_table.setRowCount(len(prices)) for row, price_data in enumerate(prices): @@ -213,6 +216,9 @@ class PriceDialog(QDialog): delete_btn = QPushButton("Удалить") delete_btn.clicked.connect(lambda checked, pid=price_data['price_id']: self.delete_price(pid)) self.prices_table.setCellWidget(row, 3, delete_btn) + # сортировку возвращаем только после заполнения (см. начало функции) + self.prices_table.setSortingEnabled(True) + def add_update_price(self): """Добавление или обновление цены""" @@ -424,6 +430,9 @@ class MainWindow(QMainWindow): def load_companies(self): """Загрузка списка компаний""" companies = self.db.get_all_companies() + # При включённой сортировке строки переставляются прямо во время заполнения, + # и кнопки строки оказываются привязаны к чужим записям — выключаем её на время + self.companies_table.setSortingEnabled(False) self.companies_table.setRowCount(len(companies)) for row, company in enumerate(companies): @@ -441,6 +450,9 @@ class MainWindow(QMainWindow): count_item = QTableWidgetItem(str(company['models_count'])) count_item.setTextAlignment(Qt.AlignmentFlag.AlignCenter) self.companies_table.setItem(row, 2, count_item) + # сортировку возвращаем только после заполнения (см. начало функции) + self.companies_table.setSortingEnabled(True) + def load_models(self, search_text=""): """Загрузка списка моделей""" @@ -449,6 +461,9 @@ class MainWindow(QMainWindow): else: models = self.db.get_all_models() + # При включённой сортировке строки переставляются прямо во время заполнения, + # и кнопки строки оказываются привязаны к чужим записям — выключаем её на время + self.models_table.setSortingEnabled(False) self.models_table.setRowCount(len(models)) for row, model in enumerate(models): @@ -507,6 +522,9 @@ class MainWindow(QMainWindow): delete_btn = QPushButton("🗑️ Удалить") delete_btn.clicked.connect(lambda checked, mid=model['model_id']: self.delete_model(mid)) self.models_table.setCellWidget(row, 10, delete_btn) + # сортировку возвращаем только после заполнения (см. начало функции) + self.models_table.setSortingEnabled(True) + def add_company(self): """Добавление новой компании""" diff --git a/scripts/exe/mobile_devices.py b/scripts/exe/mobile_devices.py index 8a44e4b..3ae0c42 100644 --- a/scripts/exe/mobile_devices.py +++ b/scripts/exe/mobile_devices.py @@ -505,6 +505,9 @@ class PriceDialog(QDialog): def load_prices(self): """Загрузка цен из БД""" prices = self.db.get_model_prices(self.model_id) + # При включённой сортировке строки переставляются прямо во время заполнения, + # и кнопки строки оказываются привязаны к чужим записям — выключаем её на время + self.prices_table.setSortingEnabled(False) self.prices_table.setRowCount(len(prices)) for row, price_data in enumerate(prices): @@ -529,6 +532,9 @@ class PriceDialog(QDialog): delete_btn = QPushButton("Удалить") delete_btn.clicked.connect(lambda checked, pid=price_data['price_id']: self.delete_price(pid)) self.prices_table.setCellWidget(row, 3, delete_btn) + # сортировку возвращаем только после заполнения (см. начало функции) + self.prices_table.setSortingEnabled(True) + def add_update_price(self): """Добавление или обновление цены""" @@ -739,6 +745,9 @@ class MainWindow(QMainWindow): def load_companies(self): """Загрузка списка компаний""" companies = self.db.get_all_companies() + # При включённой сортировке строки переставляются прямо во время заполнения, + # и кнопки строки оказываются привязаны к чужим записям — выключаем её на время + self.companies_table.setSortingEnabled(False) self.companies_table.setRowCount(len(companies)) for row, company in enumerate(companies): @@ -756,6 +765,9 @@ class MainWindow(QMainWindow): count_item = QTableWidgetItem(str(company['models_count'])) count_item.setTextAlignment(Qt.AlignmentFlag.AlignCenter) self.companies_table.setItem(row, 2, count_item) + # сортировку возвращаем только после заполнения (см. начало функции) + self.companies_table.setSortingEnabled(True) + def load_models(self, search_text=""): """Загрузка списка моделей""" @@ -764,6 +776,9 @@ class MainWindow(QMainWindow): else: models = self.db.get_all_models() + # При включённой сортировке строки переставляются прямо во время заполнения, + # и кнопки строки оказываются привязаны к чужим записям — выключаем её на время + self.models_table.setSortingEnabled(False) self.models_table.setRowCount(len(models)) for row, model in enumerate(models): @@ -822,6 +837,9 @@ class MainWindow(QMainWindow): delete_btn = QPushButton("🗑️ Удалить") delete_btn.clicked.connect(lambda checked, mid=model['model_id']: self.delete_model(mid)) self.models_table.setCellWidget(row, 10, delete_btn) + # сортировку возвращаем только после заполнения (см. начало функции) + self.models_table.setSortingEnabled(True) + def add_company(self): """Добавление новой компании"""