Seite 1 von 1

[gelöst] Zeilenindex bei sortierten Spalten ermitteln

Verfasst: 8. Dezember 2010 07:41
von schmökertante
Hallo alle zusammen,

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);
}
Bin für jeden Tip dankbar.... :roll:

Verfasst: 8. Dezember 2010 10:00
von padreigh
mapToSource nimmt einen ViewModelIndex und mapped den auf das sourceModel()ModelIndex um ... du nimmst

Code: Alles auswählen

filterModel->sourceModel()->index(logicalIndex, 0, QModelIndex()); 
das muesste wohl eher

Code: Alles auswählen

index(logicalIndex, 0, QModelIndex()); 
heissen.

Verfasst: 8. Dezember 2010 12:44
von schmökertante
Hallo Patrick,
ja, genau das ist der richtige Ansatz!
Habe es nämlich jetzt nach vielen vielen Stunden selbst raus gefunden.

Richtig ist:

Code: Alles auswählen

  QModelIndex index = filterModel->index(logicalIndex, 0, QModelIndex());
Trotzdem danke... :wink: