Seite 1 von 1

QTableView mit QSqlQueryModel Sortieren

Verfasst: 11. April 2009 18:46
von Grisu80
Hallo zusammen,

eines vorweg, ich habe schon einiges gelesen, aber ich glaube ich bin einfach zu blöd...
Ich möchte ein QTableView, der ein QSqlQueryModel enthält sortieren. Ich habe auch schon nachgelesen, dass ich QSortFilterProxyModel verwenden muss.
Jetzt lässt sich der View auch sortieren. Das Problem ist aber, dass bei einem doubleclick der Index nicht mehr stimmt.
Dafür soll die Lösung des Problems sein, eine eigene QSortFilterProxyModel Klasse zu erzeugen. Und hier sollen dann diese beiden Methoden überschrieben werden:
- mapFromSource
- mapToSource

Aber nun stehe ich vor dem Problem, dass ich absolut nicht weiß, was in die beiden Methoden gehört und wie das funktioniert.
Ich kann doch nicht der erste sein, der dieses Problem hat.

Das scheint anscheinend gar nicht so schwer zu sein. In allen Foren stoße ich am ende eines Threads zu diesem Thema immer auf den Kommentar:
"Habe die beiden Methoden überschrieben, jetzt läufts"

Eigentlich will ich nur den Inhalt aus der ersten versteckten Spalte haben (das ist der Primärschlüssel der Tabelle). Wenn ich nach einem Doppelklick auf die Zeile diesen Wert hätte, würde es mir ja schon reichen.

Ich hoffe, das mir jemand helfen kann,
ich komme nämlich einfach nicht weiter.

Gruß,

Grisu

Verfasst: 11. April 2009 20:01
von upsala
1. Warum sollte dann der Index nicht mehr stimmen?
2. Du könntest auch über die SQL-Query selbst sortieren.

Verfasst: 11. April 2009 22:03
von Grisu80
1. Warum sollte dann der Index nicht mehr stimmen?

Code: Alles auswählen

connect(ui.tvBooks, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(selectBook(const QModelIndex&))); 


void MasterOfBooks::selectBook(const QModelIndex& model){
	int row = model.row();
        record = m_sqlBuchModell->record(row);
	int id = record.value(DBID::buecher_id).toInt();
  ...
}
Wenn ich nach einer Spalte sortiere (z.B. Titel), ist der View sortiert. Aber das Buchmodel wird nicht mit sortiert. Der vom signal übermittelte Index zeigt Für das Buch "AAA" (das jetzt in der Tabelle ganz oben steht) auf die Zeile 1. Aber beim Buchmodell steht in der ersten Zeile das Buch "Qt-Programmieren", weil der SQL z.B. nach der ISBN-Nr. sortiert hat.
Ich muss also irgendwie den Index anpassen....

2. Du könntest auch über die SQL-Query selbst sortieren.
Das ist auf alle Fälle ein Möglichkeit, an die ich noch nicht gedacht habe. Allerdings muss ich dann für jedes sort,einen neuen Select machen und zusätzlich muss ich auch noch was basteln, damit ich auf die Signals des QHeaderViews reagieren kann.

Auf alle Fälle eine Option, aber ich würde wirklich gerne verstehen, wie das mit dem QSortFilterProxyModel funktioniert.

Verfasst: 11. April 2009 22:38
von upsala
Wenn man einen Proxy zwischenschaltet, dann sollte man auch komplett mit dem Proxymodel arbeiten und nicht den Index mit dem Orginal-Model mischen.

Solltest du wirklich direkt an das Orignal-Model ranwollen, dann sollten die Funktionen mapTo/FromSource auch ohne Überladen arbeiten.

Verfasst: 12. April 2009 10:32
von Grisu80
Hi,

ich glaube ich stehe auf dem Schlauch. Ich hatte auch schon gedacht, das ich weiterhin mit dem ProxyModel arbeiten muss und nicht mit dem QSqlQueryModel, aber dem ProxyModel fehelt die Methode record. Ich komme also über den Proxy nicht an den wert.
Und die Funktionen mapTo/FromSource kann ich nicht verwenden, weil die beim Proxymodell Virtuell sind.
Gibt es noch was anderes als das QSortFilterProxyModel?


Gruß und frohe Ostern,

Grisu

Verfasst: 12. April 2009 17:26
von upsala
Na und, dann sind sie halt virtuell. Was stört dich daran?