eigene Größe von QTableView-Spalten



  • Wie kann man eigentlich erreichen, dass die spalten in einem QTableView die Spalten einer MySql-Tabelle in einer bestimmten Reihenfolge und in bestimmter Breite angezeigt werden?😕 Ich versuche das mit einem QSqlRelationalTableModel zu erreichen, was mir aber überhaupt nicht gelingen will. Notgedrungenerweise greife ich auf ein QSqlQueryModel zurück, was aber nicht wirklich meinen Vorstellungen entspricht:(



  • Kannst du Code posten? Wenn du nicht zeigst, wie du es genau machst, kann mir dir schwer helfen. Und die Aussage "ich wollte es mit QSqlRelationalTableModel versuchen, aber das ging nicht" enthält keine richtige Fehlerbeschreibung. Genauso wie "Chef, ich wollte doch mit dem Auto losfahren aber es ging nicht" 😉



  • Na ja, das läuft ja wohl etwa so:

    table = new QSqlTableView();
    model = new QSqlRelationalTableModel( ... );
    table->setModel( model );

    table->setColumnWidth( ... );
    model->setRelation( ... );

    Tut mir leid, aber ich dachte das wäre so ziemlich eindeutig. 😃

    Im Qt Assistant kann ich aber über die Reihenfolge der Spalten nichts finden. Das müsste ja eigentlich im Model geschehen, bin da aber völlig ratlos. Und das setzen einer bestimmten von mir ausgewählten Breite einer Spalte sollte mit dem Befehl in Zeile 5 funktionieren, was aber leider nicht der Fall ist. Die von mir benutzten Argumente stimmen laut Referenz!



  • Es ist theoretisch klar. Aber wenn es Probleme gibt ist der Code oft die einzige Lösung, näheres zu erfahren 😉
    😉 Das Model liefert nur Daten, anzeigen tut es die View. Wenn also an der Anzeige etwas verändert werden soll -> view 😉 Du kannst über

    table->horizontalHeader()->moveSection(from, to);
    

    die Sortierung ändern.
    😉 Wenn die Breite setzen nicht funktioniert -> Code 😉
    Warum willst du die manuell setzen? Reicht nicht resizeColumn[s]ToContents()?



  • Den von dir angesprochenen resize-Befehl benutze ich schon. Das Programm wird aber von einer Horde Unwissender benutzt, die alle kurz vor dem Rentenalter sind. Die sind einfach gestrickt, und wollen, nicht, dass sich das Programm bzw. die Anzeige in der Breite irgenwie verändert. Von den sieben Spalten, die in der Tabelle sind, ist der Befehl das gelbe vom Ei, nicht aber für die zwei verbleibenden. Die haben immer wieder wechselnde Breite, und deshalb möchte ich die festlegen auf ein Maß, das etwas größer als das benötigte Maximum ist.

    Das vertauschen der Zeilen funktioniert übrigens hervorragend! -- Danke --



  • Sanni schrieb:

    Das vertauschen der Zeilen funktioniert übrigens hervorragend! -- Danke --

    Sehr schön 🙂

    Die haben immer wieder wechselnde Breite, und deshalb möchte ich die festlegen auf ein Maß, das etwas größer als das benötigte Maximum ist.

    Also geht das immer noch nciht? Kannst du mal zeigen wie du setColumnWidth() aufrufst, und wo die die Breite herziehst? Ist denn zu dem Zeitpunk schon in der Tabelle was gesetzt?



  • setColumnWidth() funktioniert jetzt merkwürdigerweise auch. Setzte den befehl ganz zum Schluss ein. Könnte es sein, dass es daran liegt? Dafür kann ich jetzt die Daten aus der MySql-Datenbank nicht sehen. Die Header werden zwar erkannt, aber der Inhalt nicht. Habe dazu folgende Zeilen:

    table = new QTableView();
    model = new QSqlRelationaltable( this, db );
    model->setTable( "tabelle" );
    table->setModel( model );
    

    Die Abfrage über das QueryModel hat immer funktioniert, eine manuelle Abfrage über die DB-Utilities funktionieren. Wo liegt denn hier der Fehler?



  • Sanni schrieb:

    Dafür kann ich jetzt die Daten aus der MySql-Datenbank nicht sehen. Die Header werden zwar erkannt, aber der Inhalt nicht.

    Was meinst du damit? Sind die Spalten leer?
    Dir fehlt BTW. noch das setRelation(), was ja eigentlich das lustige an ner QSqlRelationalTableModel ist.
    Dein Code sagt leider gar nix aus. Er ließe sich nicht mal kompilieren, denn QSqlRelationaltable gibt es nicht.
    Wäre nicht schlecht, wenn du ähnlich wie das Qt-Example "examples/sql/relationaltablemodel" ein Minimalbeispiel aufsetzt, so wie es bei dir läuft, oder eben nicht läuft -> wir wollen deinen Fehler reproduzieren können!

    Und der Query, der zusammen mit deinem QSqlQueryModel funktioniert, wäre auch nicht schlecht, am besten incl. DB-Struktur.



  • 'tschuldige, ab er ich habe den Text so aus dem Kopf geschrieben, da ich den nicht zur Verfügung hatte (Aber die Klasse QSqlRelationalTable gibt es doch gar nicht!?) Hier also der wichtige Text:

    table = new QTableView( this );
    model = new QSqlRelationalTableModel( this, db ) //db ist das korrekt initialisierte Datenbankobjekt
    model->setTable( "liste" );
    model->setRelation( 5, QSqlRelation( "besucher", "id", "name" ) );
    model->setRelation( 6, QSqlRelation( "ziele", "id", "name" ) );
    table->setModel( model );
    

    Ich hoffe diesmal sind keine Tippfehler drin 🙄
    Das Tauschen der Spalten und die Benennung der Header habe ich mir mal gespart.
    Die Datenbank sieht folgendermaßen aus:

    Drei Tabellen:
    liste: (id, anzahl, von, bis, datum, besucher_id, ziel_id)
    besucher: (id, zeichen, name)
    ziele: (id, name)
    wobei besucher_id und ziel_id foreign keys auf die entsprechenden Tabellen sind.

    Deine Vermutung war richtig. Die Header werden namentlich richtig an table übertragen, aber die Datenfelder der Tabelle sind leer. Ich habe auch mal versucht die einzelnen Felder aus dem Model auszulesen. Leider wurden mir hier 9! leere Felder ausgegeben (frag mich jetzt aber nicht, wie ich das hinbekommen habe, das habe ich in einem Anfall von Verzweiflung wieder gelöscht und vergessen, wie ich das realisiert habe -- Rekontruktion nicht möglich -- ich habe es gerade versucht. Wahrscheinlich ist es doch schon zu spät dafür)



  • model->select();
    denn sollte auch was in den Spalten stehen.

    Weiß eigentlich einer ob die Qt TableModelle ein db.open nach einem db.close durchführen ?
    Bei .net werden die Verbindungen bei db.close nicht geschlossen sondern in den db con Pool geschoben und bei open wieder zurück, die Tabele Modelle händeln das Open/Close .



  • bzw noch ein table->show();



  • Der select()-Befehl hat den ganzen Kram zum Vorschein gebracht. Dieses Problem ist also erstmal behoben.



  • Hallo,

    wollte jetzt keinen neuen Thread starten, da es vom Titel her passt und
    vom Thema nur ganz klein wenig abweicht *g*

    Bei mir geht es ebenfalls um eine QTableView und ich versuche auch die Spaltenbreite von Hand festzulegen, mit setColumnWidth. Nur das Problem
    ist das der Aufruf dieser Methode keine Wirkung zeigt, die Spaltenbreite ändert
    sich nicht. Wenn ich aber

    horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents);
    

    verwende, dann wird plötzlich die Spaltenbreite dem Inhalt angepasst.
    Gibt es eine bestimmte Vorbedingung für setColumnWidth die ich einhalten muss?
    Normalerweise reicht das ja wenn man das direkt nach erzeugung der View aufruft,
    in einem Beispiel das ich programmiert habe funktioniert der Aufruf komischerweise 😕

    Danke schonmal im voraus!


Anmelden zum Antworten