Darstellung einer Tabelle

Alles rund um die Programmierung mit Qt
Antworten
Tilman Räger
Beiträge: 189
Registriert: 6. Juni 2007 15:23
Wohnort: Göttingen

Darstellung einer Tabelle

Beitrag von Tilman Räger »

Hallo,

ich habe momentan folgendes Problem:

ich habe eine Tabelle (SQLite) mit einem Status-feld sowie mehreren Datumsfeldern, wann der jeweilige Statuswert gesetzt wurden. Ziel ist es nun, die Tabellenansicht so zu komprimieren, das lediglich der aktuelle Status und das Datum, wann dieser Status gesetzt wurde angezeigt wird, also anstelle von 5 Spalten (bei 4 mgl. Statuswerten) nur 2 Spalten.

Ist so etwas mit einem QSqlTableModel möglich oder muss ich da einen Umweg über ein anderes Model gehen, in das ich die Daten aus der Datenbank einfüttere?

Ein weiteres Problem beim Ableiten von QSqlTableModel: Wie komme ich in der Funktion data() an die Daten der einzelnen Zellen heran. Zuerst habe ich es versucht, über die Member-Funktion record(<Row>) auf die einzelnen Felder zuzugreifen, bekam aber immer nur einen leeren Datensatz. Funktioniert hat dann, der einfache Zugriff über QSqlTableModel::data(), allerdings habe ich das Gefühl, das das Programm dadurch ziemlich langsam geworden ist. Gibt es da eine bessere Methode?

mit freundlichen Grüssen
Tilman Räger
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: Darstellung einer Tabelle

Beitrag von RHBaum »

Hä ? :-)
ich habe eine Tabelle (SQLite) mit einem Status-feld sowie mehreren Datumsfeldern, wann der jeweilige Statuswert gesetzt wurden.
Das versteh ich ned ^^
mehrere Datumsfelder, jeweilige Status ... aber nur ein statusfeld ^^

Kannst du mal die Tabellen definition posten, dann kann man sich vielleicht mehr vorstellen ...
Ist so etwas mit einem QSqlTableModel möglich oder muss ich da einen Umweg über ein anderes Model gehen
das QSqlTableModel bietet sich eigentlich nur an, wenn man das logische Problem in der Abfrage kären kann.
Aka bekommst du ne abfrage hin, die in nem externen tool genau deine gewünschte Ansicht erzeugen würde ... dann QSqlTableModel.

Wenn nicht, dann würd ich von einem generischeren Model (QAbstractItemModel) ableiten, selber die tabelle fetchen und die logic c++ technisch im Model implementieren.
Da kann man dann auch noch ne ganze menge mehr machen ...
Wie komme ich in der Funktion data() an die Daten der einzelnen Zellen heran.
Am besten gar nicht ^^
Wenn du manipulieren willst, dann ist das nen sicheres zeichen das du das Model selber implementieren sollstest.
QVariant data(const QModelIndex & index, int role = Qt::DisplayRole);
ist eigentlich der zugriff den der View auf das Model ausführt ....
der QModelIndex bestimmt quasi die Zelle, und wird am Model ueber createIndex erzeugt (zeile, spalte, parent) wobei parent bei flachen modellen(table) immer null ist.
die role bestimmt was du im Variant bekommst. Vordergrundfarbe, hintergrundfarbe, editierbar, .... und AnzeigeTexte.
ändern geht da nicht.
mit setdata könnte man ändern, wenns implementiert ist ... aber dann schiessts wahrscheinlich auch auf die DB durch.
Nur für den View Ändern ist von aussen nicht wirklich möglich, und eigentlich ist genau das die aufgabe des Models, zu steuern was der view anzeigt ...

Ciao ...
Tilman Räger
Beiträge: 189
Registriert: 6. Juni 2007 15:23
Wohnort: Göttingen

Re: Darstellung einer Tabelle

Beitrag von Tilman Räger »

Hallo,

Die Tabelle enthält die Übersicht über aufgrund eines Fehleralarms versandte eMails, SMS etc. Der Status ist also z.B. 'Erzeugt', 'Benachrichtigung versandt', 'Benachrichtigung zugestellt', 'Bestätigt' oder 'Fehlgeschlagen'.
zu jedem dieser Statuswechsel wird ein separates Datum gespeichert, da ich diese Daten ggf. anzeigen muss. Für eine 1. Übersicht ist natürlich nur der aktuelle Zustand und das Datum, wann dieser gesetzt wurde wichtig. die davor liegenden Daten sind für die Übersicht eher unwichtig, müssen also vorgehalten werden. Mir schwebt also eine Tabelle vom Typ:

Code: Alles auswählen

    Benachrichtigung        akt. Status        Datum     ....
vor, ohne jeweils eine Spalte für jedes Datum anzeigen zu müssen.
Ich hoffe, das erklärt es einigermassen.

Das ich das Model selbst implementieren muss, ist klar. Mein Gedanke war einfach, ich leite von QSqlTableModel ab, dann habe ich die ganzen Datenbankzugriffe schon integriert und überschreibe die data() Funktion indem ich meine Formatierungen etc. implementiere. Das scheint allerdings eine Sackgasse zu sein. Ich müsste praktisch für Spalte 2 (beg. bei 0 in obiger Definition) nachschauen, welchen Status habe ich für den aktuellen Datensatz (d.h. Spalte 1) und dann den Inhalt des zugehörigen Datumsfeldes (d.h. Tabellenspalte 2 - x ) anzeigen. Damit scheint das QSqlTableModel überfordert zu sein (oder ich bei der Implementation :-)


Tilman
Volker75
Beiträge: 59
Registriert: 8. April 2009 21:04

Re: Darstellung einer Tabelle

Beitrag von Volker75 »

Warum nicht einfach mit "setColumnHidden" verstecken?
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: Darstellung einer Tabelle

Beitrag von RHBaum »

Der Status ist also z.B. 'Erzeugt', 'Benachrichtigung versandt', 'Benachrichtigung zugestellt', 'Bestätigt' oder 'Fehlgeschlagen'.
Also doch nur eine Status Spalte ?

theorethisch müsstest du pro "Benachrichtigung" (gruppierung) nur die spalte anzeigen, die das aktuellste Datum (Kriterium) enthält ....
richtig ?

Das sollte sich mit einer query lösen lassen ?

also sowas wie Select Benachrichtigung Status MAX(Datum) as DATUM from .... GROUP BY Benachrichtigung ? Bin kein son grosser SQL Experte :-)
Dann aber auch QSqlQueryModel benutzen ...

Ciao ...
Antworten