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
Darstellung einer Tabelle
-
- Beiträge: 189
- Registriert: 6. Juni 2007 15:23
- Wohnort: Göttingen
Re: Darstellung einer Tabelle
Hä ?
mehrere Datumsfelder, jeweilige Status ... aber nur ein statusfeld ^^
Kannst du mal die Tabellen definition posten, dann kann man sich vielleicht mehr vorstellen ...
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 ...
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 ...
Das versteh ich ned ^^ich habe eine Tabelle (SQLite) mit einem Status-feld sowie mehreren Datumsfeldern, wann der jeweilige Statuswert gesetzt wurden.
mehrere Datumsfelder, jeweilige Status ... aber nur ein statusfeld ^^
Kannst du mal die Tabellen definition posten, dann kann man sich vielleicht mehr vorstellen ...
das QSqlTableModel bietet sich eigentlich nur an, wenn man das logische Problem in der Abfrage kären kann.Ist so etwas mit einem QSqlTableModel möglich oder muss ich da einen Umweg über ein anderes Model gehen
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 ...
Am besten gar nicht ^^Wie komme ich in der Funktion data() an die Daten der einzelnen Zellen heran.
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 ...
-
- Beiträge: 189
- Registriert: 6. Juni 2007 15:23
- Wohnort: Göttingen
Re: Darstellung einer Tabelle
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:
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
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 ....
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
Re: Darstellung einer Tabelle
Warum nicht einfach mit "setColumnHidden" verstecken?
Re: Darstellung einer Tabelle
Also doch nur eine Status Spalte ?Der Status ist also z.B. 'Erzeugt', 'Benachrichtigung versandt', 'Benachrichtigung zugestellt', 'Bestätigt' oder 'Fehlgeschlagen'.
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 ...