Seite 1 von 1

QTableView & nach Datum sortieren

Verfasst: 27. Juli 2007 15:35
von lefrosch
Hallo,
ich habe eine QTableView, welche aus der Datenbank mit sehr vielen Daten gefüllt wird. Unter anderem gibt es die Spalte Datum, welche folgendermaßen dargestellt wird: dd.MM.yyyy-Thh:mm:ss. Nun kann ich über den Header der Tabelle sortieren, was auch gut funktioniert. Nur beim Datum wird leider natürlich nach Tag, dann Monat usw. sortiert. Somit habe ich also keine richtige zeitliche Sortierung sondern z.B.:
1.3.2007
2.2.2006
4.5.2008
...

Ist es irgendwie "einfach" möglich dies zu ändern. Vor allem will ich nicht die Daten neu aus der Datenbank holen.
Ich bin noch c++ &qt neuling, also sorry, wenn ich mich manchmal dumm anstelle. Aber irgendwie muss ich das schaffen.
Danke.

Verfasst: 27. Juli 2007 17:46
von upsala
Ist das Datumsfeld auch ein Datumsfeld? Dann sollte die Sortierung auch richtig funktionieren. Ansonsten, muß du dir mit QSortFilterProxyModel was eigenes dazwischenbasteln....

Verfasst: 31. Juli 2007 11:15
von lefrosch
ja, ich habe es als Datumsfeld, welches ich aber dann ja zur richtigen (deutschen) Darstellung in einen String umwandeln muss. Oder geht das auch anders, dass er mir das Datum mit Zeit im "deutschen" Format darstellt?
Das mit dem QSortFilterProxyModel ist glaub ich zu hoch für mich...

Verfasst: 31. Juli 2007 11:50
von Zandru
du könntest nach der "originalspalte" mit dem Datumsfeld sortieren und um trotzdem deutsche Darstellung zu haben eine weitere spalte mit Strings einfügen, und die originalspalte einfach nur verstecken - setColumnHidden(...)

Gruß,
Zandru

Verfasst: 31. Juli 2007 12:00
von lefrosch
danke. hab ich mir auch schon überlegt. aber wie mach ich es dann, dass wenn ich in den header der "deutschen" datumsspalte die versteckte sortiere?

Verfasst: 31. Juli 2007 12:13
von Zandru
hmm, vielleicht sollte man einen hack nicht mit einem weiteren hack fixen ;)

schonmal QLocale angeschaut?

QLocale::setDefault(QLocale::German); // irgendwo ganz oben ins main()

Verfasst: 31. Juli 2007 12:20
von lefrosch
bringt keine Änderung

Verfasst: 31. Juli 2007 12:24
von upsala
Ansonsten könnte man es noch mit einem eigenen QItemDelegate machen. (Die Darstellung nicht die Sortierung)

Verfasst: 31. Juli 2007 12:51
von Zandru
schade :oops: eigentlich verwunderlich, dass es da noch keinen Mechanismus in Qt gibt, aber ich glaube upsala hat recht - ein eigener Delegate für die Darstellung (mit überladenem paint) ist wohl das Beste.

Verfasst: 31. Juli 2007 13:59
von lefrosch
hilfe, muss das so kompliziert sein?

ich habe eine liste, die ich durchgehe um mein view aufzubauen:

Code: Alles auswählen

resultmodel = new QStandardItemModel(stlList.size(), 6);
...
{
...
QStandardItem* changedDateItem = new QStandardItem();
			
changedDateItem->setData(getLastChangedDate().toString(dateFormat), Qt::DisplayRole);
resultmodel->setItem(j, 5, changedDateItem);
j++;
i.next();
}
resultmodel->setHeaderData(...	
...
resultmodel->setHeaderData(5, Qt::Horizontal, tr("Geändert am"));
ui.tableViewResult->setModel(resultmodel);
ich habs auch mal versucht mit dem signal auf den header, aber irgendwie mag es die funktion nicht aufrufen. es reagiert einfach nicht:

Code: Alles auswählen

connect(ui.tableViewResult->horizontalHeader(),SIGNAL(sectionClicked(int)),this,SLOT(meinefunktion(int)));
hier mein Ausschnitt. Ich bin zu neu im geschäft um dieses Problem lösen zu können, leider. Vielleicht hat jemand die Zeit ... ka...

Verfasst: 31. Juli 2007 15:13
von lefrosch
ok, ich habs jetzt hinbekommen über eine versteckte spalte und einem connect auf den headerklick.

Verfasst: 3. August 2007 16:18
von Zandru
also ich hab nun nochmal selber getestet:

QLocale::setDefault(QLocale::German);

funktioniert bei mir wunderbar. allerdings sollte man es wohl ausführen, bevor irgendein anderer Qt-Code ausgeführt wird. - Also noch vor QApplication...