Probleme mit Model/View/Delegate - Felder Auswählen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

Hallo!


Kurz: Ich bin ein Anfänger im Bereich Python (etwa 3 Wochen), und erst recht im bereich Qt/PyQt.
Ich verstehe nicht von Objekt-Orientiertem Programmieren und co.
Darum habe ich keine Externe klasse für meine Gui, sondern alles von Hand in mein Hauptprogramm reingeschrieben. Mit sicherheit nichts tolles zum lesen :S
Auch mit den Signalen habe ich probleme.
Ich

Ausgangslage:
Ich habe eine Datenbank (SQLITE) mit dem Namen "data.db"
Diese enthält eine Tabelle mit n spalten, je nach vohergegangener Benutzereingabe.
Die erste Spalte enthält einen Excel-Timestamp. Es sind Daten im Minutentakt eingespeichert.

Was ich möchte:
Vieles.
Ich möchte am Ende erreichen, das die Datenbank Benutzerfreundlich dargestellt wird.
Ich stelle mir das so vor:
Ein QTabWidget mit den Tabs:
*Auswahl: In diesem Tab soll für jede Spalte eine Checkbox mit dem Namen der Spalte daneben angezeigt werden.
Zudem 2 Date (mit Kalender) und 2 Timeedits
2 Radioboxes: Summe/Einzelwerte
Ein Button: Ok! oder so... Wenn man das überhaupt benötigt, um die die Views zu aktualisieren...
*Tabelle
Hier sollen die Werte der Ausgewählten Spalten im Zeitbereich zwischen Dateedit1, Timeedit1 und Dateedit2, Timeedit2 angezeigt werden.
Und zwar entweder aufsummiert oder als Einzelwerte
Der Zeilentitel sollte die mit xldate_as_tuple (aus Modul xlrd) umgewandelte Zeit anzeigen.
*Graph
Optional: Die Werte in der Tabelle sollen in einem x/t-Diagramm aufgezeichnet werden.
*Export:
Es soll die Möglichkeit bestehen, die Tabelle als Excel-File zu exportieren
Es soll die Möglichkeit bestehen den Graphen als Bild zu Exportieren

Was ich kann:
Ich habe mit dem Modul sqlite3 und einer weiteren Tabelle, in der ich die Namen der Spalten mitgespeichert habe (da ich zu blöd war die mit sqlite3 rauszubekommen) in einer Forschleife die Checkboxen erstellt.
Wenn ich auf den OK!-Button klicke bekomme ich eine Liste mit einem Boolschen Wert für jede Spalte, sowie den Daten und Zeiten.

Ich kann die Daten der gesammten Tabelle anzeigen.

Ich kann die Tabelle als Excel-File (mit xlwt und sqlite3) exportieren.


Wo es hängt:
Ich hörte es sei Möglich auch Checkboxen abhängig der Daten aus dem Model zu generieren.
Dies hätte den Vorteil das ich nicht ständig zwischen den SQL-Verbindungen hin und her switchen muss, da SQLite ja nur eine Verbindung je DB erlaubt.

Das erstellen und einbinden eines Delegators, welcher abhängig vom Status der Checkboxen und Date/Timeedits die Tabelle und den Graphen anpasst.

Das erstellen des Graphen mit den Daten aus dem Model.


Ich würde mich freuen, wenn mir jemand hierbei helfen kann...


lg,
achilles_69
User
Beiträge: 21
Registriert: Dienstag 31. März 2009, 14:05
Wohnort: Bielefeld

Hallo,

eine fertige Lösung kann ich nicht liefern, aber ein paar Anregungen hätte ich schon:
Ausgangslage:
Ich habe eine Datenbank (SQLITE) mit dem Namen "data.db"
Diese enthält eine Tabelle mit n spalten, je nach vohergegangener Benutzereingabe.
Die erste Spalte enthält einen Excel-Timestamp. Es sind Daten im Minutentakt eingespeichert.
Autsch! Das hört sich für mich so an, als ob Deine Datenbank überhaupt nicht normalisiert ist. Man darf Datenbanken nicht mit Tabellenkalkulationen verwechseln! Eine Variable Anzahl von Feldern in einer Datenbank ist eine ganz schlecht Idee.
Wo es hängt:
Ich hörte es sei Möglich auch Checkboxen abhängig der Daten aus dem Model zu generieren.
Dies hätte den Vorteil das ich nicht ständig zwischen den SQL-Verbindungen hin und her switchen muss, da SQLite ja nur eine Verbindung je DB erlaubt.
Dies hängt mit dem oben gesagten eng zusammen: wenn das zugrunde liegende Datenmodell "Datenbank-Like" ist - also ordentlich normalisiert - lösen sich solche Probleme meist in Wohlgefallen auf.
Mein Tipp ist, dass Du dir nochmal ein paar grundsätzliche Gedanken zur Datenbank machst. Wie gesagt: eine Datenbank als Tabellenkalkulation zu vergewaltigen ist eine schlecht Idee.
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

Naja - im Grunde würde mir auch eine Tabellenkalkulation reichen, so diese keine (oder fast keine) Begrenzung der Zeilenanzahl hat.

Es handelt sich dabei um Messdaten, die zunächst in einigen Excel-Dateien befinden.

Die Exceldateien werden ausgelesen, und für jede Spalte mir dem Namen des Messkanals eine Spalte in der Datenbank abgelegt.
Ich gebe ja zu, ich missbrauche hier SQL als einfache Tabelle, aber es ist doch nicht sehr Funktionell, jedes mal unzählige Excel-Files zu öffnen, um mir die Daten zusammen zu sammeln - zumal das auch vom Speicherverbrauch nicht zu empfehlen ist.

Es soll mir also die Auswertung von Messreihen über längere Zeiträume erleichtern.

Ich habe mir auch überlegt, ob ich die Daten vieleicht in einer Einfachen TXT-Tabelle ablege (welcher Seperator auch immer),
aber das ist nicht so gut aus einigen Gründen:
1: Bei SQL habe ich immerhin schon eine ausgereifte Möglichkeit die benötigten Daten zu Selektieren
2: Wenn ich eine neue Spalte einfüge, könnte ich probleme Bekommen, je nach dem, wie ich die Abfrage realisiere.

Zudem wäre eine andere Lösung mit der Datenbank eher komplizierter, da das QSqlTableModel ja auch nur auf eine Tabelle ausgelegt ist, nur eine Tabelle angezeigt werden soll (allerdings sollen halt auf Wunsch spalten Ausgeblendet werden, und auch nur die Zeilen eines bestimmten Bereichs)
achilles_69
User
Beiträge: 21
Registriert: Dienstag 31. März 2009, 14:05
Wohnort: Bielefeld

Okay, auf das Format der Excel-Dateien scheinst Du also keinen Einfluss zu haben.

Ich habe mal eine Vergleichbare Sache gehabt: die Spalten-Zahl war variabel. Ich habe meine SQL-Tabellen schön normalisiert und mir dann eine Klasse in Python geschrieben, die mir einen Zugriff auf die Daten ermöglichte, als wären sie in einer Tabelle abgelegt (also Zugriff über Zeile und Spalte), die Klasse hat also von der Tabellenstruktur vollkommen abstrahiert.

Die Beschäftigung mit Klassen lohnt sich absolut und empfehle ich Dir wärmstens...

Die Darstellung habe ich dann über eine abgeleitete Klasse von QtCore.QAbstractTableModel realisiert. Ich hatte mir zwar auch QSqlTableModel angeschaut - das passte aber nicht auf mein Datenbank-Modell.

War zwar ein Haufen Arbeit - funktioniert jetzt aber wunderbar.

Ich kenne mich mit SQLite nicht aus (verwende selber PostgreSQL), aber es sollte eine Möglichkeit geben, die Tabellenschemata über System-Kataloge auszulesen. Das sieht der SQL-Standard auch so vor.
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

Ja, es sollte möglichkeiten geben.
Allerdings scheint das anderes zu sein, als bei MySQL, und wenn ich den Select-Befehl verwende, den man ab und an im Internet findet, bekomme ich nur den Ursprünglichen Create-Befehl.

Darum habe ich mir dafür eine weitere Tabelle angelegt, mit den Spalten:
tabelle und spalte und index
Da wird jedesmal wenn eine Spalte erstellt wird, ein Eintrag angelegt.
Dann kann ich über SELECT tabelle FROM struktur GROUP BY tabelle alle Tabellen erhalten, oder mit SELECT spalte FROM struktur WHERE tabelle == data alle Spalten der Tabelle data erhalten.
Ich hab mir die Schematabelle also selbst angelegt.

SQLite hat leider nochnicht alle Standarts implementiert.
Antworten