// инициализацияQAction *removeLinesAction = new QAction(QIcon(":/images/table/table_row_delete.png"), tr("Remove lines"), this);removeLinesAction->setEnabled(false);// Соединяем QAction со слотом удаления строкconnect(removeLinesAction, SIGNAL(triggered()) , this, SLOT(removeLines()));// соединяемся с сигналом, рассказывающем все о том, что выделил пользователь в QTableViewQTableView *itemView = new QTableView(this);connect(itemView->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)) , this, SLOT(selectionChanged(QItemSelection, QItemSelection)));QToolButton *removeLinesButton = new QToolButton(this);removeLinesButton->setDefaultAction(removeLinesAction);// Слот обрабатывающий изменение выделенияvoid selectionChanged(QItemSelection, QItemSelection){ QAbstractItemModel* model; removeLinesAction->setEnabled(itemView->selectionModel()->selectedRows().count());}// Слот удаляющий строкиvoid removeLines(){ QAbstractItemModel* model; if ((model = itemView->model())) { QItemSelectionModel* selectionModel = itemView->selectionModel(); QModelIndexList indexes = selectionModel->selectedRows(); if (indexes.isEmpty()) return; int messageBoxResult; messageBoxResult = QMessageBox::question(QApplication::activeWindow() , tr("Removing data") , tr("Data will be removed permanently. Continue?"), QMessageBox::Yes, QMessageBox::No); if (messageBoxResult == QMessageBox::No) return; int count = 1; int startRow = indexes.at(0).row(); QModelIndex rootIndex = indexes.at(0).parent(); // delete only first continuous selection for (int i = 1; i < indexes.count(); ++i) { if (indexes.at(i - 1).row() != indexes.at(i).row() - 1) break; else ++count; } model->removeRows(startRow, count, rootIndex);// Под вопросом нужен ли вызов данных функций здесь if (!model->submit()) model->revert(); return; }}// Переопределяем фильтр сообщений. В нашем случае фильтруем QTableView::verticalHeader()bool eventFilter(QObject* object, QEvent* event){ if (event->type() == QEvent::ContextMenu) { QContextMenuEvent* menuEvent = static_cast<QContextMenuEvent*>(event); QHeaderView* headerView = qobject_cast<QHeaderView*>(object); if (headerView) { if (headerView->orientation() == Qt::Vertical) { QList<QAction*> actions; actions.append(removeLinesAction); QMenu::exec(actions, menuEvent->globalPos(), 0, headerView); // отфильтровали return true; } } } return QObject::eventFilter(object, event);}