2016-06-15 8 views
0

Ich habe eine QTableView mit einigen Daten. Die Daten ändern sich manchmal, und dann muss TableView aktualisiert werden. Nach der Aktualisierung verliert der Cursor die Position. Wenn es in 5 Position (Zeile) war, ist die Aktualisierung außerhalb der Tabellenansicht (oder in der ersten Zeile). Ich will es wieder auf 5, aber es funktioniert nicht.QTableView und setzen Zeigerposition

ich zuletzt gespeicherte Position von „index = ui->tableView->currentIndex()“ und von „ui->tableView->setCurrentIndex(index)

zurück Was ist los?

//save last cursor(row) position 
QModelIndex index = ui->tableView->currentIndex(); 

//create basic model with my data 
myModel = new MyModel(); 

//insert my model to sortfilterproxymodel and then sort it 
QSortFilterProxyModel *sort_filter = new QSortFilterProxyModel(this); 
sort_filter->setSourceModel(myModel); 
sort_filter->setSortCaseSensitivity(Qt::CaseInsensitive); 
sort_filter->sort(0, Qt::AscendingOrder);  //sort by name 
sort_filter->sort(5, Qt::DescendingOrder);  //sort by surename 

//insert my data to tableview 
ui->tableView->setModel(sort_filter); 
ui->tableView->hideColumn(5); 

//return it back to its original position 
ui->tableView->setCurrentIndex(index); 

Antwort

3

Durch setModel Aufruf aktualisieren Sie das Modell und damit nicht mehr Ihr Index kann gelten:

Hinweis: Modell Indizes sofort verwendet werden soll, und dann verworfen. Sie sollten sich nicht darauf verlassen, dass Indizes nach dem Aufruf von Modell Funktionen, die die Struktur des Modells ändern oder Elemente löschen, gültig bleiben. Wenn Sie einen Modellindex im Laufe der Zeit beibehalten müssen, verwenden Sie einen QPersistentModelIndex.

http://doc.qt.io/qt-5/qmodelindex.html#details

+0

Ok, also wie kann ich einen Zeiger auf eine bestimmte Position. Weil durch QModelIndex index = ui-> tableView-> currentIndex(); int row = index.row(); Ich kenne die letzte aktive Position. – exo

+0

Sie können den 'row()' - Wert verwenden, um einen neuen 'QModelIndex' von Ihrem Modell über' index (...) 'zu erhalten und diesen für' setCurrentIndex() 'zu verwenden. –

+0

Vielen Dank für Ihre Hilfe. Ich habe immer noch ein Problem. Ich habe diese Konstruktion gemacht 'QPoint Punkt (Zeile, 0);' 'Index = ui-> TableView-> IndexAt (Punkt);' 'Ui-> TableView-> SetCurrentIndex (Index);'. Jetzt ist die Zeile ausgewählt, aber auf der falschen Position. Immer auf der ersten sichtbaren Reihe bleiben. – exo