Programmcrash bei QListView::setCurrentIndex
Verfasst: 10. September 2013 12:26
Kurzbeschreibung:
Eine Klasse "Daten" wird gespeichert in einer Liste "QList<Daten *>". Daten aus dieser Liste werden in einem QListView (sortiert) angezeigt.
QListView erhält die Daten über ein "QSortFilterProxyModel" von einer aus "QAbstractListModel" abgeleiteten Klasse.
Mit "append(Daten *daten)" füge ich der Liste neue Daten hinzu und möchte anschließend in der ListView zur neuen Zeile springen. Vereinfacht mit diesem Ablauf(genaues siehe unten):
Fehler:
Mit Qt4.8.1 läuft das Programm wie erwartet, aber bei Qt5.0 gibt es in der Zeile "setCurrentIndex(index)" Probleme und das Programm stürzt ab.
Hier ein Auszug aus dem Programmcode
Eine Klasse "Daten" wird gespeichert in einer Liste "QList<Daten *>". Daten aus dieser Liste werden in einem QListView (sortiert) angezeigt.
QListView erhält die Daten über ein "QSortFilterProxyModel" von einer aus "QAbstractListModel" abgeleiteten Klasse.
Mit "append(Daten *daten)" füge ich der Liste neue Daten hinzu und möchte anschließend in der ListView zur neuen Zeile springen. Vereinfacht mit diesem Ablauf(genaues siehe unten):
Code: Alles auswählen
int row = datenClass.count();
datenList.insert(row,daten);
sort();
QModelIndex index = proxyModel->mapFromSource(datenClass->index(row,0));
ui->listView->setCurrentIndex(index);
Mit Qt4.8.1 läuft das Programm wie erwartet, aber bei Qt5.0 gibt es in der Zeile "setCurrentIndex(index)" Probleme und das Programm stürzt ab.
Hier ein Auszug aus dem Programmcode
Code: Alles auswählen
class Daten {
.....
.....
};
class DatenClass : public QAbstractListModel {
.....
.....
private:
QList<Daten *> datenList;
};
int DatenClass::append(Daten *daten){
int row = datenClass.count();
emit layoutAboutToBeChanged();
beginInsertRows(QModelIndex(),row,row+1);
datenList.insert(row,daten);
endInsertRows();
emit layoutChanged();
return row;
}
MainProg::MainProg(.....) {
datenClass = new DatenClass(this);
proxyModel = new QSortFilterProxyModel(this);
proxyModel->setSourceModel(datenClass);
ui->listView->setModel(proxyModel);
.....
connect(datenClass,SIGNAL(layoutChanged()),this,SLOT(sort()));
}
void MainProg::sort(void){
proxyModel->sort(0);
}
int MainProg::setCurrentRowFromSource(int row){
QModelIndex index = proxyModel->mapFromSource(datenClass->index(row,0));
if ( index.isValid() ) {
row = index.row();
ui->listView->setCurrentIndex(index);
}
return row;
}
int row = datenClass->append(new Daten(.....));
setCurrentRowFromSource(row);