Qt удалить выбранную строку в QTableView

Я хочу, чтобы удалить выбранную строку из таблицы, когда я нажимаю на .

но я не могу найти ничего относительно удаления строк в документации Qt. Есть идеи?

Image

3 ответов


можно использовать bool QAbstractItemModel::removeRow(int row, const QModelIndex & parent = QModelIndex()) функции для этого.

здесь вы можете найти пример за все это.

кроме того, вот встроенная цитата из этой документации:

removeRows()

используется для удаления строк и элементов данных, которые они содержат от всех типов модели. Реализации должны вызывать beginRemoveRows() перед вставкой новых столбцов в любые базовые структуры данных и вызов endRemoveRows() сразу после этого.

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


вы можете использовать другой способ, удалив строку из базы данных, затем очистите модель и заполните ее снова, это решение также безопасно при удалении нескольких строк.


Если вы удаляете несколько строк, вы можете столкнуться с некоторыми осложнениями с помощью removeRow() звонок. Это работает с индексом строк, поэтому вам нужно удалить строки снизу вверх, чтобы индексы строк не смещались при их удалении. Вот как я это сделал в PyQt, не знаю C++, но я думаю, что это очень похоже:

def remove_rows(self):
    # I create a list of rows to be removed, and then remove them as a separate task
    remove_list = []

    for sel_range in self.table.selectedRanges():
        for c in range(sel_range.rowCount()):
            row = c + sel_range.topRow()
            remove_list.append(row)

    # removing from the bottom up keeps the indices from changing around as we take rows out
    for row in sorted(remove_list, reverse=True):
        self.table.removeRow(row)

отлично работает для меня! Однако одно дело знать, в моем случае эта функция вызывается, когда пользователь нажимает на определенную ячейку (в которой есть кнопка с 'X'). К сожалению, когда они нажимают на эту кнопку, она отменяет выбор строки, что затем предотвращает ее удаление. Чтобы исправить это, я просто захватил строку отправителя и добавил ее в "remove_list" в самом начале, перед "циклами for". Это выглядит так:

remove_list.append(self.table.indexAt(self.sender().pos()).row())