@ZIK1337

Как реализовать проверку содержимого изменяемой ячейки tableWidget?

Подскажите, пожалуйста, наиболее подходящий способ проверки содержимого редактируемой ячейки в таблице.

Нужно:
Либо проверять сразу при вводе каждого символа (пока еще курсор мигает, т.е. не отправлен сигнал closeEditor) - соответствует ли этот символ требованиям, и если нет - стирать (обязательно) его и выводить соответствующее сообщение.

Либо уже после нажатия Enter или подобного, что вызывает сигнал closeEditor - проверять всю ячейку посимвольно, и если символ не соответствует требованиям - возвращать ячейку к предыдущему состоянию (т.е. не давать сохранить изменения) и выводить сообщение.

Предпочтительнее скорее второй вариант, чем первый.
Как это реализовать? Желательно с примером (понимаю, что нужно переопределить метод, но как именно - точно не знаю), заранее спасибо.
  • Вопрос задан
  • 67 просмотров
Решения вопроса 1
@bbkmzzzz
void QTableWidget::cellChanged(int row, int column) - испускается при изменении данных в ячейке
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@ZIK1337 Автор вопроса
Оставил пока решение с сохранением предыдущего значения ячейки при двойном клике по ней.
Если будет какое-то более подходящее решение, напишите, пожалуйста.

self.tableWidget.cellChanged.connect(self.check_change)
self.tableWidget.doubleClicked.connect(self.save_cell)
...
    def save_cell(self):
        global previous_cell
        previous_cell = str(self.tableWidget.currentItem().text())

    def check_change(self):
        cell = self.tableWidget.currentItem().text()
        if len(set(cell)) == len(cell):
            for b in cell:
                if b not in 'rwxa':
                    QtWidgets.QMessageBox.warning(self, 'Ошибка при изменении',
                                                  'В ячейке таблицы находится недопустимый символ!\n'
                                                  'Разрешенные символы: rwxa',
                                                  QtWidgets.QMessageBox.Ok)
                    self.tableWidget.currentItem().setText(previous_cell)
                    self.tableWidget.currentItem().setTextAlignment(QtCore.Qt.AlignCenter)
                    return
        else:
            QtWidgets.QMessageBox.warning(self, 'Ошибка при изменении',
                                          'В ячейке таблицы находится неуникальный символ!\n'
                                          'Право субъекта на объект должно быть уникальным.',
                                          QtWidgets.QMessageBox.Ok)
            self.tableWidget.currentItem().setText(previous_cell)
            self.tableWidget.currentItem().setTextAlignment(QtCore.Qt.AlignCenter)
            return
Ответ написан
Ваш ответ на вопрос

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

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