SQLite/SQL was kann es mit QT4?

Alles rund um die Programmierung mit Qt
Antworten
Ingeborg
Beiträge: 8
Registriert: 30. Januar 2012 01:32

SQLite/SQL was kann es mit QT4?

Beitrag von Ingeborg »

Hallo Leute,

ich bin ein durchschnittlicher Programmierer, der angefangen hat mit C,C++ und Matlab zu programmieren. In dem Zusammenhang habe ich schon einigen Mist verzapft und mein neues Projekt soll als StandAlone GUI über ein Kassenführungs und -abrechnungsprogram laufen (achtung QTNeuling!!). Wenn ich das richtig kapiert habe, laufen die Datenbanken unter SQL oder SQLite. Nun will ich folgendes machen. Ich habe bisher 4 Tabellen (ich denke die Anzahl ist nicht so wichtig).

Alle Tabelleninhalte müssen unterschiedlich lang konsistent über Jahre gespeichert werden und ich muss außerdem komplett flexibel im Datenzugriff und -änderung sein (einzelne Zellen ändern, rows & couloums löschen und hinzufügen) sein. Ich benötige die Daten aber noch in anderen WidgetKlassen im MainWindow um von dort beispielsweise Abrechnungen, Kassenabschlüsse und Diagramme (Randfrage, noch nicht wichtig:gibs hier Empfehlungen zur Realisierung??) zu zeichnen. Ich geh davon aus, dass SQL (Diagramme jetz nicht)das leistet, obwohl ich noch nie mit Datenbanken praktisch gearbeitet habe. Obendrein muss ich das auch noch verschlüsseln, am besten mit zwei Codearten, Benutzer und Mastercode umd Benutzercodes zurückzusetzen.

Wie läuft zum einen die Speicherung von Tabelleninhalten generell ab? Wie man QTableView und QStandartItemModel klassen verwendet is soweit gebongt, selbst in die SQL-Programmierung sind die ersten Einblicke vorhanden, nur mit der QItemDelegate Klasse komme ich noch nicht ganz klar und zwar wie man mit SubClassing sich Access verschaffen kann und in der DB rumpfuscht.

Zusammengefasst nochmal
(- Diagramme zeichnen- Vorschlag für gute Opensourcelib?)
- Speicherung auf Rechner, Zugriff von Rechner, Datenentnahme und Wieder-in-die-Tabelle-schreib-sprinzip kurz erklären.
- QItemDelegate, wäre eine kurze Erläuterung sinnvoll, würde sich aber durch eine kurze Erläuterung des ersten Stichpunktes(ohne Klammer) wahrscheinlich erledigen.

Ich kämpfe quasi im moment an mehreren Fronten. Ihr würdet mir bei der Hilfe bei einzelnen Fragen viel Zeit sparen.

Liebe Grüße,

die Inge
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: SQLite/SQL was kann es mit QT4?

Beitrag von RHBaum »

- Diagramme zeichnen- Vorschlag für gute Opensourcelib?
- wenn man eh mit Qt arbeitet, drängt sich QWT förmlich auf. Auf alle Fälle anschauen zumindest. http://qwt.sourceforge.net/
- Ansonsten gibts ne Menge, meist Kostenpflichtiger, ActiveX basierender, "Diagramm Zeichnen Komponenten" aufn Markt. Ueber Active QT zwar bissi fummelig, aber trotzdem besser als selbst was zu schreiben
sollt man nur erwägen, wenn man wirklich spezielle dinge braucht.
- unter Linux, glaub unter windows gehts auch, gnuplot bemühen. bietet sich an, wenn man die DIagramme als Bild(png,jpg ... ) in anderen tools eh weiterverwenden will /muss
- brauch man ganz exquisite dinge, die sehr speziell und sehr variabel sein muessen, kann man sich auch ueberlegen, die daten per csv, oder Active X in eine Spzialisierte Anwendung pumpen zu lassen, MS Excel ueber Active X, keine Ahnung wie man OpenOffice Calc befuellen kann von aussen, aber geben tuts da sicher was. Dann kann man sich in den Tools mit den Diagramm-Möglichkeiten austoben.
Speicherung auf Rechner, Zugriff von Rechner, Datenentnahme und Wieder-in-die-Tabelle-schreib-sprinzip kurz erklären.
SQL halt :-)
Du bast ne Verbindung zu deiner Datenbank auf. Im einfachsten Falle (SQLite) ist das nen File, Kann aber auch ne Verteilte DB auf nem Server Cluster sein, dann brauchst Servernamen, DB Namen, Login ....
Steht die Verbindung, kannst mit SQL-DML (Data Manipulation Language) Anweisungen die Daten persistent Ablegen (INSERT z.b.) und später wieder abfragen (SELECT z.b. )
Die schoene Theorie: SQL ist eine Sprache .. man sollte also ohne Probleme die DB engines austauschen koennen, ohne das viel in deinem Prog ändern Musst.
Also fuer den Ersten wurf, kann man mit SQLite alles in ein Locales file schreiben lassen .... Später dann auf nen ausgewachsenes RDBM (MYSQL, Oracle, Informix, Postgree) umsteigen, wenn die DatenMengen und die Anzahl der User mal steigen.
Leider sind nicht alle SQL Dialekte Gleich, und der Funktionsumfang vom Standard SQL sehr minimal, aka nicht ausreichend. SO dass man doch wieder anpassen muss ....

SQL Hat aber nicht nur Vorteile ....

Kommst auf Geschwindigkeit an, hat SQL keine chance gegenueber IO Schreiboperationen auf der Platte ...
Alles wird ueber "Strings" modeliert - konvertierungen kosten rechenzeit ...
SQL DB's Skalieren nicht immer ideal, nur je AnwendungsFall. Bspw. Wenig unterschiedliche Tabellen, kaum verknuepfungen, aber astronomisch viel daten daten drinne ... tut man sich schwer mit Erweitern (clustern).
Solche SpezialFälle sind meist ein Fall für "NOSQL" - Datenbanken.

Das solltest bei deinen Ideen beruecksichten :-)
Also fuer konkrete Entscheidungen solche Überlegungen einfliessen lassen:
- Welches BS
- Wieviel User Gleichzeitig zugriff auf DB
- Isses ueberhaupt nen Project wo das Programm im Vordergrund steht, oder eher das "Lernen"
- Performance
- Umfang der Daten ...
QItemDelegate, wäre eine kurze Erläuterung sinnvoll, würde sich aber durch eine kurze Erläuterung des ersten Stichpunktes(ohne Klammer) wahrscheinlich erledigen.
Generell zu dem Thema.
MVC-Konzept - Modell, View Controller ( http://de.wikipedia.org/wiki/Model_View_Controller )
verstehen lernen :-) dann hasst es einfacher ... und verstehst das Qt MVC auch :-)

QItemDelegate kommt dann ins Spiel, wenn du Die Darstellung eines "Items" aka Zelle in einer Tabelle, Item in einem List/Tree View, selber uebernehmen willst/musst.
Uber das ItemDeligate kannst du das verhalten beeinflussen ... zb, wenn statt den nakten Text, irgend was gemaltes, oder nen anderes visuelles Element erscheinen soll ... meist in Tabellen sinvoll.
Ausserdem, und das ist das wichtigere, ist er fuer die Erzeugung, des Editors notwendig, wenn du auf ein Item in den Edit mode gelangst.
Also wenn statt ner TextEingabe (TextEdit) du ne ComboBox mit einer Liste Vordefinierter Werte brauchst usw ...

Du koenntest generell ein QSQLTableModell nehmen. Das schreibt auch in die DB ....
Empfehlen wuerd ich das nicht, eher nur fuer kleine "Tools"

Bei "grösseren" Projekten sollte man unbedingt das 3 Schichten system einhalten ...
(Drei-Schichten-Architektur) http://de.wikipedia.org/wiki/Schichtena ... e-Systemen

In der Praxis sieht es dann meist so aus, dass die man selber Models schreibt, die direkt auf die Logikschicht aufsetzen ....
Die Models verbindet man dann mit den Entsprechenden views ...
Die hauptarbeit steckt in den Models, und natürlich in der LogicSchicht ...

Hoffe das hilft ...

Ciao ....
Ingeborg
Beiträge: 8
Registriert: 30. Januar 2012 01:32

Re: SQLite/SQL was kann es mit QT4?

Beitrag von Ingeborg »

Hallo RHBaum,


Danke für die Hinweise. Ich denke ich komm langsam hinter die verschiedenen Architekturen.
Ich habe mir auch diverse Architekturen angesehen. Ich frage mich nur eins.

Was ist nun der Unterschied zwischen dem normalen StandardItemModel und dem SQL Model?
Ich weiß das SQL mit relationalen Dben arbeitet und das verwirrt mich gerade.

Sind denn die normale Tableviews nicht auch sowas wie relationale Dben und darauf hin auch deren Models?

Welchen Einfluss haben die Models von SQL auf die DBen?

Wie ich eine erstelle ist mir recht klar, aber die Modelthematik bringt mich echt durcheinander. Trägt das SQL Model direkt in eine abgespeicherte Relation ein??

Zu den Kriterien
- Welches BS
Sollte alles abdecken, uU sogar Smartphones BSe. Soweit ich weiß progt QT auch für WindowsphoneBS und Android auch. Bei Apple bin ich nicht ganz sicher.
- Wieviel User Gleichzeitig zugriff auf DB
Immer nur einer, der quasi Verwaltet. Soll ja ein Abrechnungsprogramm sein.
- Isses ueberhaupt nen Project wo das Programm im Vordergrund steht, oder eher das "Lernen"
Beides. QT + SQL und Datenbanken allgemein halt, sowie C++. So große C++ Projekte habe ich nicht bearbeitet, habe aber alles soweit verinnerlicht, wegen der guten C- Erfahrungen.
- Performance
Wenn das Laden von einer großen Tabelle mal ne halbe Sekunde dauert, isses ok. Ändern solls eh nur per PushButton Signal.
- Umfang der Daten ...

4 Relationen, alle recht klein außer eine große mit knapp 1000-3000 Tupel. Muss sich noch zeigen.

Grüße und vielen Dank!!
Ingeborg
Beiträge: 8
Registriert: 30. Januar 2012 01:32

Re: SQLite/SQL was kann es mit QT4?

Beitrag von Ingeborg »

Servus!!

Ich möchte gerne eine Datenbank erstellen und sie dauerhaft auf der Festplatte speichern.
-Auf was muss ich da achten? Ich habe die neueste QT4 Version runtergeladen er ich habhaft werden konnte. Muss ich noch etwas zusätzlich runterladen und installieren? Ich habe uach bei manchen Tuts was von gelesen. Ich komme auch deswegen darauf, da ich mit folgenden Code:

Code: Alles auswählen

#include "testdb.h"
#include "C:/QtSDK/Simulator/Qt/mingw/include/QtSql/qsql_mysql.h"

void testDB::create_db()
{
    QSqlDatabase db = new QSqlDatabase();

    QSqlQuery *qu = new QSqlQuery(db);

    qu.exec("CREATE DATABASE IF NOT EXISTS testDB");
    
}
Ich habe mir das so gedanklich zusammengeschustert und die SQL Befehle im Netz zusammengesucht.
Ich bekomme aber folgende Fehlermeldungen.

Code: Alles auswählen

C:\Dokumente und Einstellungen\\hello-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK__Debug\..\Desktop\QT_examples\hello world\hello\testDB.cpp:8: Fehler:no matching function for call to 'QSqlQuery::QSqlQuery(QSqlDatabase*&)'

C:\Dokumente und Einstellungen\Inge\hello-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK__Debug\..\..\..\QtSDK\Desktop\Qt\4.7.4\mingw\include\QtSql\qsqlquery.h:69: candidates are: QSqlQuery::QSqlQuery(const QSqlQuery&)

C:\Dokumente und Einstellungen\Inge\hello-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK__Debug\..\..\..\QtSDK\Desktop\Qt\4.7.4\mingw\include\QtSql\qsqlquery.h:68: note:                 QSqlQuery::QSqlQuery(QSqlDatabase)

C:\Dokumente und Einstellungen\Inge\hello-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK__Debug\..\..\..\QtSDK\Desktop\Qt\4.7.4\mingw\include\QtSql\qsqlquery.h:67: note:                 QSqlQuery::QSqlQuery(const QString&, QSqlDatabase)

C:\Dokumente und Einstellungen\Inge\hello-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK__Debug\..\..\..\QtSDK\Desktop\Qt\4.7.4\mingw\include\QtSql\qsqlquery.h:66: note:                 QSqlQuery::QSqlQuery(QSqlResult*)

Ich hatte auch noch was von Treibern gelesen, habe aber auch viele Snippets gefunden, die eine Einbindung der QsqlDatabase in eine QsqlQuery Klasse machen.
Über eine Antwort würde ich mich freuen.

Grüße!!

Inge
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: SQLite/SQL was kann es mit QT4?

Beitrag von franzf »

Ingeborg hat geschrieben:Ich komme auch deswegen darauf, da ich mit folgenden Code:
da du mit folgendem Code wa?

Code: Alles auswählen

#include "testdb.h"
#include "C:/QtSDK/Simulator/Qt/mingw/include/QtSql/qsql_mysql.h"

void testDB::create_db()
{
    QSqlDatabase db = new QSqlDatabase();

    QSqlQuery *qu = new QSqlQuery(db);

    qu.exec("CREATE DATABASE IF NOT EXISTS testDB");
    
}
:/ Das schaut ja nach nem Java-Versuch in C++ aus. Die erste Zeile in create_db sollte schon einen Fehler auslösen, für die zweite hast du ihn gepostet, die dritte Zeile geht auch nicht (in C++).
Und wenn du sqlite haben willte, warum dann qsql_mysql.h einbinden? (Den braucht man auch mit MySQL nicht...)
Ich habe mir das so gedanklich zusammengeschustert und die SQL Befehle im Netz zusammengesucht.
Man schustert sich nichts gedanklich zusammen, schon gar nichts bringt es, wenn man sich im Netz irgend welche Befehle zusammensucht. Man sollte versuchen zu verstehen, was da abgeht.

Deshalb erstmal kurze Antwort:
Versuch erstmal C++ zu lernen. Wie erstelle ich Objekte, was gewirken sie (z.B. HEAP vs STACK, new+delete, usw.) Denn wenn ich das so sehe bist du mit C++ noch heillos überfordert, da solltest du mit Qt noch ein wenig warten (man wird sicher trotzdem was hinbekommen, aber das wird ein anstrengender, zeitaufwändiger Kampf, die Zeit wäre besser in C++ lernen (gutes Buch, keine Tutorials!) angelegt).
Wenn du dich dann mit den Qt-Sachen beschäftigst, als erstes die Soku gründlich (!) lesen, und anhand der bereits mirgeliferten Beispiele Verständnis aufbauen.
Antworten