@RG2

При нажатии на кнопку «Отмена» удаленный индекс не возвращается, как эту проблему решить?

Привет. Есть программа, которая добавляет проект OrCAD.
Головной код программы - main.py
В программе есть раздел "Редактирование", который изменяет проект, добавляя или удаляя пользователем индексы. В разделе есть кнопка "Отмена", которая удаляет добавленный или добавляет удаленный пользователем индекс. Функция работает только на добавленный, а на удалённый нет. Все осуществляется через RAWData.py . Вот фрагмент.
def delRecord(self):
        selection_model = self.tree_view.selectionModel()
        selected_indexes = selection_model.selectedIndexes()
        rows_to_remove = []
        values_to_remove = []
        parent_values = []
 
        for index in selected_indexes:
            row = index.row()
            if row not in rows_to_remove:
                rows_to_remove.append(row)
 
            item = self.tree_model.itemFromIndex(index)
            value = item.text()
            if index.column() < 2:
                values_to_remove.append(value)
                print(value)
 
        for row in sorted(rows_to_remove, reverse=True):
            parent_index = selected_indexes[0].parent()
 
            parent_item = self.tree_model.itemFromIndex(parent_index)
            parent_text = parent_item.text()
            parent_values.append(parent_text)
 
            self.tree_model.removeRow(row, parent_index)
            print(parent_text)
            print(row)
 
        x = 0
        for i in range((len(values_to_remove))//2):
            print(temp_value)
            if temp_value == 'product1':
               if self.query.exec(f"DELETE FROM RAWDATA WHERE PartReference = '{values_to_remove[x]}' AND ManufacturerPartNumber = '{values_to_remove[x+1]}'"):
                   print("Data updated successfully")
               else:
                   print("Ошибка выполнения запроса:", self.query.lastError().text())
            elif temp_value == 'product2':
                if self.query.exec(f"DELETE FROM RAWDATA WHERE ClassPart = '{values_to_remove[x]}' AND ManufacturerPartNumber = '{values_to_remove[x + 1]}' AND PartReference = '{parent_values[(x//2)]}'"):
                    print("Data updated successfully")
                else:
                    print("Ошибка выполнения запроса:", self.query.lastError().text())
            elif temp_value == 'product4':
                if self.query.exec(f"DELETE FROM RAWDATA WHERE ClassPart = '{values_to_remove[x]}' AND PartReference = '{values_to_remove[x + 1]}'"):
                    print("Data updated successfully")
                else:
                    print("Ошибка выполнения запроса:", self.query.lastError().text())
 
            x = x + 2
 
        self.tree_model.submit()
        self.tree_view.setModel(self.tree_model)
 
    def addRecord(self):
        # Создаем стек отмены, если он еще не был создан
        if not hasattr(self, 'undo_stack'):
            self.undo_stack = []
        selection_model = self.tree_view.selectionModel()
        selected_indexes = selection_model.selectedIndexes()
 
        # Определяем родительскую группу выделенной строки
        parent_index = selected_indexes[0].parent()
 
        # Создаем пустую строку для отображения в TreeView
        empty_row = [QStandardItem('-') for _ in range(5)]  # Определение переменной empty_row
        parent_item = self.tree_model.itemFromIndex(parent_index)
        row_position = selected_indexes[0].row() + 1
 
        # Проверяем, есть ли уже такие элементы в дереве
        existing_items = [parent_item.child(i) for i in range(parent_item.rowCount())]
        if empty_row not in existing_items:
            if row_position <= parent_item.rowCount():  # Проверяем, что позиция вставки превышает количество элементов в родительском элементе
                parent_item.insertRow(row_position, empty_row)
                # Сохраняем информацию о последней добавленной записи
                self.last_added_index = (parent_item, row_position)
                # Обновляем представление (TreeView) с новой строкой
                self.tree_view.setModel(self.tree_model)
 
                # Если операция добавления прошла успешно, добавляем действие в стек отмены
                self.undo_stack.append(('add', parent_item, row_position, empty_row.copy()))  # Создаем копию empty_row
            else:
                print("Ошибка: Позиция вставки превышает количество элементов в родительском элементе.")
        else:
            print("Ошибка: Пустая строка уже существует в данной группе.")
 
        class_part = parent_item.text()
        if self.query.exec(f"INSERT INTO RAWDATA (ClassPart, PartReference, ManufacturerPartNumber, Manufacturer, Quantity, Description) VALUES ('{class_part}', '-', '-', '-', '-', '-')"):
            print("Data add successfully")
            if self.query.exec(
                    f"UPDATE RAWDATA SET PartReference = '-', ManufacturerPartNumber = '-', Manufacturer = '-', Quantity = '-', Description  = '-' WHERE ClassPart = '{class_part}' AND PartReference = '-' AND ManufacturerPartNumber = '-'"):
                print("Data updated successfully")
            else:
                print("Ошибка выполнения запроса:", self.query.lastError().text())
        else:
            print("Ошибка выполнения запроса:", self.query.lastError().text())
 
    #процедура проведения классификации компонентов. Вызывается в режиме редактирования сырых импортированных данных.
 
    def Cancel(self):
        try:
            if hasattr(self, 'undo_stack') and self.undo_stack:
                # Получаем все действия из стека отмены
                actions_to_undo = list(reversed(self.undo_stack))
                print("Действия для отмены:", actions_to_undo)  # Выводим содержимое стека отмены для отладки
                for action, parent_item, row_position, removed_row in actions_to_undo:
                    if action == 'add':
                        parent_item.removeRow(row_position)
                        print("Добавление элемента отменено.")
                    elif action == 'del':
                        # Получаем родительский индекс и вставляем удаленную строку
                        self.tree_model.insertRow(row_position, removed_row)
                        print("Удаление элемента отменено.")
                print("Содержимое стека отмены перед очисткой:", self.undo_stack)
                self.undo_stack.clear()  # Очищаем стек отмены
                self.tree_model.layoutChanged.emit()
            else:
                print("Отмененное действие не найдено в стеке отмены.")
        except Exception as e:
            print("Ошибка при отмене:", e)

Помогите исправить ошибку.
  • Вопрос задан
  • 39 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы