QModelIndex richtig erstellen? Wie funktioniert createindex?

Verschiedenes zu Qt
Antworten
Meho
Beiträge: 16
Registriert: 24. September 2013 16:41

QModelIndex richtig erstellen? Wie funktioniert createindex?

Beitrag von Meho »

Hallo an alle,
leider benötige ich wiedereinmal eure Hilfe.

Ich habe Probleme mit dem Auslesen aus einem QSqlQueryModel mittels QModelIndex, an einer Stelle meines Codes funktioniert es an einer anderen nicht und ich finde den Fehler nicht! :-(

Der Code der funktioniert: (sortFilter ist global auf dem heap ein QSortFilterProxyModel)
void DbmsWindow::showContent(QModelIndex index)
{
int row = index.row();
QModelIndex firstCollum = sortFilter->index(row,3);
QString baa = sortFilter->data(firstCollum,Qt::DisplayRole).toString();
cout << "PersonID ist: "<<baa.toStdString()<<endl;
}
Wenn ich hier einen Haltepunkt setze und im Debugger mir firstCollum anschaue steht da mei r und c die passenden Werte, also c=3 und r=das wo ich geklickt hatte.

der Code wo es nicht funktioniert:
void ViewContent::newExec(DbManager *incomingDatabase, int id)
{
QString mailQuery="SELECT anrede, vorname, nachname FROM dm_person p WHERE p.personid=";
mailQuery=mailQuery+id;

QSqlQueryModel *tempQModel = new QSqlQueryModel();
QSortFilterProxyModel localSortFilter;
QModelIndex currentIndex;

//übergibt den Query und ein Pointer auf das Model und liest die Daten in das Model
incomingDatabase->auslesen(mailQuery,tempQModel);
localSortFilter.setSourceModel(tempQModel);

currentIndex = localSortFilter.index(0,1,QModelIndex());
cout<<"Fooo: "<< localSortFilter.data(currentIndex,Qt::DisplayRole).toString().toStdString() <<endl;
ui->leFirstName->setText(localSortFilter.data(currentIndex,Qt::DisplayRole).toString());
}
Wenn ich hier in den Haltepunkt schaue ist currentIndex immer bei r=-1 und c=-1 und das cout bringt nur Fooo: ,sonst nix!

Ich habe es auch schon mit :
currentIndex = localSortFilter.createIndex(0,1,0);
Versucht nur da mach ich was mit dem 3. Parameter falsch der soll const quint32 sein, was muss ich da übergeben?
so bekomme ich folgenden Fehler: "/usr/include/qt4/QtCore/qabstractitemmodel.h:325: Fehler:'QModelIndex QAbstractItemModel::createIndex(int, int, int) const' is protected"

Das wird sicherlich nur eine Kleinigkeit sein die ich nicht seh, hoffe ich ;-)

Vielen Dank schonmal für eure Hilfe!!!!!!

Grüße Meho
Meho
Beiträge: 16
Registriert: 24. September 2013 16:41

Re: QModelIndex richtig erstellen? Wie funktioniert createin

Beitrag von Meho »

Hallo @ all,
schade, dass bislang keiner weiter helfen konnte.
Ich habe den Fehler auch nicht gefunden, habe mich aber nin mit einem QSqlQuery beholfen.
Das sieht wie folgt aus:

Wähle die verbundene Datenbank

Code: Alles auswählen

QSqlQuery localQry(QSqlDatabase::database( "DDatabase" ));
sende Query:

Code: Alles auswählen

        localQry.prepare("SELECT dm_anschrift.anschriftid FROM dm_anschrift, dm_anschperson, dm_person"
                         "WHERE dm_person.personid = dm_anschperson.personid"
                         "AND dm_anschperson.anschriftid = dm_anschrift.anschriftid"
                         "AND dm_person.personid="+id+";");
        localQry.exec();
Setze "Zeiger" auf erste Zeile und gib mit value(x) den Inhalt der x ten Spalte aus.

Code: Alles auswählen

 
       if (localQry.first())
        {
            addressID=localQry.value(0).toString();
            cout<<"addressID: "<< addressID.toStdString() <<endl;
        }
Beende Verbindung.

Code: Alles auswählen

localQry.finish();
Ich bin aber trotzdem noch an einer Antwort wegen dem Zugriff auf das Modul interessiert ;-), danke!
Auch noch hilfreich ist:
http://qt-project.org/doc/qt-4.8/sql-model.html

Gruß Meho
nebler
Beiträge: 51
Registriert: 9. Juli 2009 15:26

Re: QModelIndex richtig erstellen? Wie funktioniert createin

Beitrag von nebler »

Hallo Meho,

ich habe Deine Problemstellung noch nicht ganz verstanden.
Hier aber ein paar Allgemeine Sachen zu QModelIndex / QAbstractItemModel.

Jedes Model selbst erstellt das QModelIndex, den darfst und solltest Du als Aufrufer nicht erstellen dürfen.
Grund ist das dritte Argument was ein quint oder ein Pointer sein kann.
In meinen Model-Implementierung nutze ich den 3. Parameter um festzustellen, wo ich mich im Model eigentlich befinde (sprich meine Datenhaltung).
Daher ist es auch eine blöde Idee so ein QModelIndex über einen längeren Laufzeit (sofern sich was am Model ändert) zu speichern.
Dazu gibt es ein QPersistentModelIndex (oder so) Implementierung von Qt aus.

Wenn Dir das Model ein Index mit (-1,-1,0) zurückliefert, bedeutet das, dass das QModelIndex nicht valide ist.
Siehe die Funktion "QModelIndex::valid()". Dies bedeutet wiederum, das es an der Stelle keinen Eintrag gibt.

Meine Vermutung wäre, dass beim SqlQueryModel, das Query nicht korrekt ist.
Hierzu gibt es ja die Methoden "QSqlQueryModel::lastError()".

Als Tipp, um besser zu verstehen, was im Model drin steckt, weiße einer View (TableView o.ä.) einfach das Model hinzu (ohne ProxyModel zwischendrin) und schaue ob die Daten passen.
Das ProxyModel ist nicht unbedingt zum sortieren notwendig. Es gäbe auch die Methode "QAbstractItemModel::sort(...)". Je nach Anwendungsfall. Im Bestenfall sortiert, aber bereits die SQL Engine das Ergebnis.

Viele Grüße
Antworten