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

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

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

Образ

6

Решение

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

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

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

removeRows ()

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

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

13

Другие решения

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

1

Если вы удаляете несколько строк, вы можете столкнуться с некоторыми сложностями, используя 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())
1
По вопросам рекламы [email protected]