Widgets rebellieren gegen QGridLayout!

Alles rund um die Programmierung mit Qt
Antworten
Fabeltier
Beiträge: 33
Registriert: 3. Juni 2007 04:46
Wohnort: München

Widgets rebellieren gegen QGridLayout!

Beitrag von Fabeltier »

Hallo, ich hab ein Layout Problem. Folgender Code erzeugt ein Dialogfenster, dass so aussehen soll, wie es aussieht, wenn die mit FIXME markierten Zeilen dekommentiert sind! Diese Zeilen find ich allerdings bescheuert und ich verstehe nicht, warum ich das daemliche QListWidget mit einer statischen Groessenangabe klein zwingen und die dummen QLineEdits mit einer Minimum Angabe gross halten soll, wenn das QGridLayout doch schon entsprechend eingestellt ist? Das muss doch auch anders gehen im QGridLayout!

Wie stellt man sowas normalerweise ein, wo sind die Hebel an denen ich da drehn kann?

Code: Alles auswählen

// Editor.cpp

#include <QtGui>

class Editor : public QDialog
{
    QPushButton *bt1, *bt2, *bt3, *bt4, *bt5, *bt6;
    QLineEdit *le1, *le2, *le3, *le4;
    QLabel *lb1, *lb2, *lb3, *lb4;
    QListWidget* listWidget;

public:
    Editor(){ initGUI(); };
    
    void initGUI()
    {
        // buttons
        bt1 = new QPushButton(tr("#1"));
        bt2 = new QPushButton(tr("#2"));
        bt3 = new QPushButton(tr("#3"));
        bt4 = new QPushButton(tr("#4"));
        bt5 = new QPushButton(tr("#5"));
        bt6 = new QPushButton(tr("#6"));

        le1 = new QLineEdit(tr("le1"));
//        le1->setMinimumWidth(200); // FIXME ???
        le2 = new QLineEdit(tr("le2"));
        le3 = new QLineEdit(tr("le3"));
        le4 = new QLineEdit(tr("le4"));

        lb1 = new QLabel(tr("lb1"));
        lb2 = new QLabel(tr("lb2"));
        lb3 = new QLabel(tr("lb3"));
        lb4 = new QLabel(tr("lb4"));

        // list(PROBLEM)widget
        listWidget = new QListWidget();
//        listWidget->setMaximumWidth(100); // FIXME: ???

        QGridLayout* gloEditor = new QGridLayout;
        gloEditor->addWidget(listWidget, 0, 0, 6, 1);
        gloEditor->addWidget(lb1, 0, 2, 1, 1);
        gloEditor->addWidget(le1, 0, 3, 1, 3);
        gloEditor->addWidget(lb2, 1, 2, 1, 1);
        gloEditor->addWidget(le2, 1, 3, 1, 3);
        gloEditor->addWidget(lb3, 2, 2, 1, 1);
        gloEditor->addWidget(le3, 2, 3, 1, 3);
        gloEditor->addWidget(lb4, 3, 2, 1, 1);
        gloEditor->addWidget(le4, 3, 3, 1, 3);
        gloEditor->addWidget(bt1, 0, 6, 1, 1);
        gloEditor->addWidget(bt2, 1, 6, 1, 1);
        gloEditor->addWidget(bt3, 2, 6, 1, 1);
        gloEditor->addWidget(bt4, 3, 6, 1, 1);
        gloEditor->addWidget(bt5, 5, 5, 1, 1);
        gloEditor->addWidget(bt6, 5, 6, 1, 1);
        setLayout(gloEditor);

        // window
        setWindowTitle(tr("Editor"));
        setFixedSize( sizeHint().width(), sizeHint().height());
    };
};


int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    Editor* dialog = new Editor();
    dialog->show();
    return app.exec();
};
PS: die Zeilenausdehnung fuer die LineEdits in der Grid Angabe ist auf 3 gestellt, statisch gaebe ich hier mit 200 quasi nur 2. Egal, faktisch bleiben sie ja eh lieber auf mickrigen 1??!!!
:evil:
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Schon mal versucht es im Designer nachzubilden? Ohne es probiert zu haben, sehe ich Lücken im Layout. SizePolicys fehlen auch.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
neuschi
Beiträge: 78
Registriert: 23. Mai 2007 10:59

Re: Widgets rebellieren gegen QGridLayout!

Beitrag von neuschi »

Fabeltier hat geschrieben: Wie stellt man sowas normalerweise ein, wo sind die Hebel an denen ich da drehn kann?
Ersetze deine "FIXME" Zeilen mal durch folgendes:

[widgetname]->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);

\Ralf
Fabeltier
Beiträge: 33
Registriert: 3. Juni 2007 04:46
Wohnort: München

Beitrag von Fabeltier »

Hallo,
Ich habe exakt an den FIXME-Stellen nun folgendes stehen:

Code: Alles auswählen

// ...
         le1 = new QLineEdit(tr("le1"));
//        le1->setMinimumWidth(200); // FIXME ???
         le1->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); 
         le2 = new QLineEdit(tr("le2"));
         le3 = new QLineEdit(tr("le3"));
         le4 = new QLineEdit(tr("le4"));
// ...
und

Code: Alles auswählen

// ...
        // list(PROBLEM)widget
        listWidget = new QListWidget();
//        listWidget->setMaximumWidth(100); // FIXME: ???
        listWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); 
// ...
Leider sieht das Fenster wieder wie ohne (statische) Groessenangaben aus.

Ich habe das Fenster natuerlich auch schon im Designer nachgebaut, dort sah es allerdings ebenfalls wie ohne statische Groessenangaben aus - ich konnte also auch dort nicht die richtigen Hebel ausmachen (bin ich mit dem GUI Builder nicht so bewandert).

Ich hatte gestern noch etwas weitergelesen und mit Stretch, einer Art Zeilen bzw. Spaltenprioritaet, des QGridLayout rumgespielt. Allerdings steht dort bei einem aehnlichen Beispiel mit Spaltenbreiten und Zeilenhoehen, im Text meines Assistant:
Note that the columns and rows are not equally wide or tall. If you want two columns to have the same width, you must set their minimum widths and stretch factors to be the same yourself. You do this using setColumnMinimumWidth() and setColumnStretch().
Ich verstehe das nun so, dass (falls es tatsaechlich ein vergleichbares Problem ist) man mit Minimum und Maximum Grenzen arbeitet - hier direkt fuer die Spalten und Zeilen im Layout, als auch einen enstprechenden Stretchfaktor einstellt um dem ueberfluessigen Platz beim dehnen aufzuteilen - da ich das Fenster nun "fixed" haben will, denke ich nun, reichen also die statischen Angaben doch!? Wie seht Ihr das?


Edit: @Macman: Welche Luecken siehst Du? Wuerdest Du sie mir bitte auch verraten? Danke :wink:
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

In deinem Layout ist die 2. Spalte leer, hat aber keine Auswirkungen. Was die Größen angeht, so kommt man um statische Angaben für Min und Max nicht rum. Woher soll der Layoutmanager auch wissen, wie es aussehen soll. Bei komplexen Layouts kann das ein ganz schönes Gefummel werden, bis es sich so verhält wie man es sich vorstellt.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
Fabeltier
Beiträge: 33
Registriert: 3. Juni 2007 04:46
Wohnort: München

Beitrag von Fabeltier »

Danke Macman! Das denke ich auch, ist das Problem: wie mit der leeren 2. (bzw 1. vom Index her) Spalte umgegangen werden soll. Und genau das scheint auch der Sinn von Stretch zu sein. Naja, wie gesagt mit der Keule der "fixen Groessenangaben" laesst sich das schon auch erschlagen, wenn auch nur eher etwas unelegant. Aber gut, vllt gibt's noch nen weg ueber die Policies.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Wie soll es denn sein? Hat die 2. Spalte irgendeinen Sinn?
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
Fabeltier
Beiträge: 33
Registriert: 3. Juni 2007 04:46
Wohnort: München

Beitrag von Fabeltier »

Sie hat nur den Sinn zu demonstrieren, dass das (boese) listWidget gefraessiger ist als die anderen Widgets. Das war alles.

Im ernst, ich wollte einerseits herausfinden, was passiert wenn ich eine Reihe auslasse? Wird der Platz aufgeteilt; bekommt die leere Spalte dann gar keinen Platz; oder bleibt sie - mit ihrem Platz - frei?

Andererseits, dachte ich, ob ich in 1-er Schritten oder 5-er Schritten vorgehe, es keinen Unterschied macht (eben die Spalte bekaeme gar keinen Platz). Anscheinend haben jedoch manche Widgets/Spalten zB eine hoehere Platzprioritaet (sh. listWidget) als andere (sh. QLineEdit). Ohne dass ich das vorher explizit eingestellt haette. Somit bekommt die Spalte Platz, dieser wird ihr allerdings von "wichtigeren" Widgets wieder entrissen.

Und wo ich das einstellen kann, ist eben die Frage. Sizepolicy? Stretch? Min/MaximumSize? Naja, bin ja grad erst am Anfang mit Qt.
Antworten