[gelöst] Zeilenindex bei sortierten Spalten ermitteln

Alles rund um die Programmierung mit Qt
Antworten
schmökertante
Beiträge: 13
Registriert: 5. Oktober 2010 15:09

[gelöst] Zeilenindex bei sortierten Spalten ermitteln

Beitrag 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:
Zuletzt geändert von schmökertante am 8. Dezember 2010 12:45, insgesamt 1-mal geändert.
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag 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.
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
schmökertante
Beiträge: 13
Registriert: 5. Oktober 2010 15:09

Beitrag 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:
Antworten