Ich habe ein QTableView mit einem horizontal und vertical Header. Sortierfunktion ist eingeschlatet.
Als Model habe ich ein QStandardItemModel und ein QSortFilterProxyModel.
Meine Daten werden Zeilenweise dargestellt. Funktioniert alles bestens bis hierhin. Jetzt möchte ich aber mit einem Click auf die verticalheader die jeweilige Zeile löschen können, d.h. ich muß ja ein Signal von dem verticalHeader abfangen. Hier gäbe es "sectionClicked", das funktioniert auch, aber nur solange, wie keine Sortierung vorliegt, dann bekomme ich den falschen Index, jetzt habe ich versucht mit "mapToSource" den wahren Index zu bestimmen, da bekomme ich aber die Fehlermeldung:
QSortFilterProxyModel: index from wrong model passed to mapToSource
Bin mit meinen Latein ziemlich am Ende. Kann mir jemand helfen?
Hier nochmal die Funktion:
Code: Alles auswählen
//##############################################################################
GroupWidget::GroupWidget(QWidget *parent)
: QTableView(parent)
{
model = new QStandardItemModel;
QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel;
proxyModel->setSourceModel(model);
proxyModel->setDynamicSortFilter(true);
setModel(proxyModel);
// hier werden die 15 Spalten im horizontalHeader erzeugt
// wurden gelöscht der übersicht halber
horizontalHeader()->setClickable(true);
verticalHeader()->setClickable(true);
verticalHeader()->setResizeMode(QHeaderView::Fixed);
delegate = new Delegate();
setItemDelegate(delegate);
resizeColumnsToContents();
setMinimumSize(QSize(500, 0));
connect(verticalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(rowClicked(int)));
}
//##############################################################################
void GroupWidget::rowClicked(int logicalIndex)
{
if(logicalIndex == model->rowCount(QModelIndex())-1)
{
// Hier wird eine neue Zeile hinzugefügt
return;
}
QSortFilterProxyModel *filterModel = static_cast<QSortFilterProxyModel*>(QTableView::model());
qDebug() << logicalIndex;
QModelIndex index = filterModel->sourceModel()->index(logicalIndex, 0, QModelIndex());
qDebug() << index.row();
QModelIndex proxyIndex = filterModel->mapToSource(index);
qDebug() << proxyIndex.row();
columnType *field = dbData->getField(proxyIndex.row(), FIELD_GRP_NUMBER);
if(QMessageBox::question(this, tr("Warnung"), tr("Möchten sie die Gruppe '%1' wirklich löschen?").arg(field->lValue[0]), QMessageBox::Yes|QMessageBox::No, QMessageBox::No) == QMessageBox::No)
return;
model->removeRow(logicalIndex);
dbData->removeRow(field->dbRow);
}