QTableView mit QSqlQueryModel Sortieren

Alles rund um die Programmierung mit Qt
Antworten
Grisu80
Beiträge: 43
Registriert: 14. September 2005 16:01
Wohnort: Münster

QTableView mit QSqlQueryModel Sortieren

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

1. Warum sollte dann der Index nicht mehr stimmen?
2. Du könntest auch über die SQL-Query selbst sortieren.
Grisu80
Beiträge: 43
Registriert: 14. September 2005 16:01
Wohnort: Münster

Beitrag 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.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
Grisu80
Beiträge: 43
Registriert: 14. September 2005 16:01
Wohnort: Münster

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Na und, dann sind sie halt virtuell. Was stört dich daran?
Antworten