Qt MySql

Alles rund um die Programmierung mit Qt
Antworten
janmerkschien
Beiträge: 45
Registriert: 5. Juli 2011 10:08

Qt MySql

Beitrag von janmerkschien »

Hey,
kann mir einer sagen wie ich einen Teil einer Datenbank auslesen und in ein QSqlTableModel schreibe?

z.B. so:
QSqlTableModel Tmodel = query.exec("SELECT * FROM `adressen` limit 0,10");
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Re: Qt MySql

Beitrag von Exasperation »

Hier reinschauen: Qt und SQL
janmerkschien
Beiträge: 45
Registriert: 5. Juli 2011 10:08

Re: Qt MySql

Beitrag von janmerkschien »

Danke für die schnelle antwort :)
aber hier lerne ich wie ich die select anfrage an den server sende
und hier lerne ich wie ich ein model anlege.

aber wie kann ich mir die daten vom server schicken lassen das ich die auch in ein model schreiben kann?
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Re: Qt MySql

Beitrag von Exasperation »

Okay, dann schau dir vielleicht mal das Query Model Example an.
Da werden zwar eigene Models implementiert, aber der Code in der main.cpp sollte eigentlich das zeigen, was du machen möchtest.

Die Verbindung? Das hier?

Code: Alles auswählen

QSqlQuery ( const QString & query = QString(), QSqlDatabase db = QSqlDatabase() )
Wenn du beim Anlegen deiner QSqlDatabase keinen Bezeichner angibst, ist das eine default Datenbank und QSqlQuery wird automatisch auf diese DB zugreifen.

Was genau ist dein Problem? :)
Wo dein Server ist etc weiß ich nicht, und vor allem was es für einer ist. Die Beispiele sind eigentlich eindeutig :o
janmerkschien
Beiträge: 45
Registriert: 5. Juli 2011 10:08

Re: Qt MySql

Beitrag von janmerkschien »

Ich hab nen mysql server und ich würde gerne die ersten 10 spalten auslesen danach die nächsten 10 und so weiter . . .
und die 10 ausgelesenen spalten dann in einem QSqlTableModel ausgeben ^^
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: Qt MySql

Beitrag von RHBaum »

Ins Model View Konzept solltest dich auch einarbeiten, bei dem Was du vor hasst.

Wenn Du ein Model Schreiben willst, was die Daten vom Server über die Scrollposition selber nachlaed, weil es das generische SQL Model nur unperformant loest fuer dich, Dann solltest du dein eigenes Model schreiben -> aka von QAbstractItemModel ableiten ....
Dort Musst du genau die Funktionen überladen, in denen das Model die Daten vom server holt ... Positionen (row,coumn) werden dir ueber ModelIndizies abstrahiert, so das du die "limits" ausrechnen kannst ...
Einzig was bissi tricky iss, die richtigen groessen zum vorladen (cachen) errechnen ...

Ciao ...
janmerkschien
Beiträge: 45
Registriert: 5. Juli 2011 10:08

Re: Qt MySql

Beitrag von janmerkschien »

ok das werde ich dann machen ;)
danke :)
aber sollte ich nicht lieber das QAbstractTableModel nehmen??
weil hier steht wenn ich ein QTableView verwenden möchte wäre das QAbstractTableModel besser.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: Qt MySql

Beitrag von RHBaum »

Der unterschied zwischen QAbstractItemModel und QAbstractTableModel:

QAbstractTableModel baut dir die index() und dropMimeData() Methode schon, so dass sie für eine flache (keine Hirarchie) Matrix passen.

Ob man dropMimeData() braucht, bzw die Standard funktionalitaet verwenden kann ... weiss ich nicht ^^
Die Standard Impl der index() Methode wiederum wuerd ich recht haeufig selber überladen, weil ich dem ModelIndex (data()) meist noch was Mitgebe, was performancetechnisch bissi was bringt und spaeter das arbeiten vereinfacht ...

Also fuer mich bringt QAbstractTableModel meist keinerlei Vorteile, deswegen ignor ich es :-)
Der Unterschied ist fast wirklich nur die index Methode, die scho implementiert ist. Und in nem flachen Model iss die nen 1 Zeiler, den man sich spart ^^

Ciao ...
janmerkschien
Beiträge: 45
Registriert: 5. Juli 2011 10:08

Re: Qt MySql

Beitrag von janmerkschien »

ok ^^
nur ich habe mir noch nie ein model selber gebastelt ..
wie kann ich dem model denn jetzt beibringen das es bearbeitbar ist und das es die funktion setQuery kann?
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: Qt MySql

Beitrag von RHBaum »

QSQLQueryModel hat ein public setQuery() !
Das darfst du auch nutzen ....

Fuer jede Zelle frag der View "flags" ab, die bestimmen welches Verhalten die Zelle hat,
Wenn du die flags() Methode am Model überlaedst, hasst du das selber in der hand ...

Nehmen wir an, du leitest von QSQLQueryModel ab ...

dann kannst du die Flags methode Folgender Massen überladen:

Code: Alles auswählen

Qt::ItemFlags	MyNewSQLModel::flags( const QModelIndex & index ) const
{
     Qt::ItemFlags mflags = QSqlQueryModel::flags(index);
     // Jetzt hier selber anhand des Index checken, ob die Zelle bearbeitbar ist:
     // Nehmen wir mal an, du willst nur die 3. Spalte bearbeitbar machen
     if(index.column() == 2 )
    {
          // dem orginalen Flag nur noch das Bearbeitbar flag mit hinzutun
          mflags |= Qt::ItemIsEditable;
    }
    return mflags ;
}
WIe gesagt, beschaeftige dich mit dem Model View Controller (ohne Controller bei der qt) Konzept.
Das Prinzip ist maechtig, verwendet nen anerkanntes GUI bezogenes Konzept , eines der wenigen die es da gibt ....
Das wird dir anderswo eh nochmal unterkommen, nur vielleicht in anderen Formen :-)

Und bei der QT kann man das Super gebrauchen ... ich verwend "Rohe" Views gar nicht mehr, ich verwend nur noch Views mit Models, weil sie sich viel sauberer und damit wiederverwendbarer programmieren lassen ....

Ciao ...
janmerkschien
Beiträge: 45
Registriert: 5. Juli 2011 10:08

Re: Qt MySql

Beitrag von janmerkschien »

also nochmal um zu kucken ob ich das richtig verstanden habe. . .
ich soll ein eigenes model erstellen und das QSqlQueryModel als subclass nehmen?
dann dort die methedo ItemFlags über laden mit dem code den du mir geschrieben hast??
und dann kann man auch die daten bearbeiten??
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: Qt MySql

Beitrag von RHBaum »

Viele Wege fueheren nach ROM ....

DU kannst auch von QAbstractItemModel ableiten, nur musst da etwas mehr tun ... dafuer kannst das verhalten sicher noch mehr auf deine Beduerfnisse anpassen ...
Arbeite dich in das Konzept ein! Dort wird auch beschreiben, wie nen View ermittelt, ob ein Index bearbeit sein soll oder nicht, und was es bei bearbeiten machen soll, aka welchen editor oeffnen etc.
Ohne das Wissen wirst sowieso schiffbruch erleiden.
So Fragen nach: "Welches Wort muss ich mit was ersetzen" damit es funktioniert, werden dir nicht weiterhelfen.

Ciao ...
Antworten