Layouts und CentralWidget

Alles rund um die Programmierung mit Qt
Antworten
Einmaliger
Beiträge: 48
Registriert: 22. Juli 2006 11:42

Layouts und CentralWidget

Beitrag von Einmaliger »

Hallo !

Ich möchte als Central Widget meiner Applikation ein bestimmtes eigenes Widget und am linken Rand ein weiteres Widget ähnlich einer ScrollBar, sagen wir mal, einen QSlider. Das Problem ist, dass dieses rechte Widget so schmal wie möglich bleiben soll, während das linke so viel Platz wie nur möglich einnimmt. Wie geht das?

Und wie setzt man überhaupt den CentralWidget auf ein Layout statt auf einen Widget? Ich habe es etwas "hintenrum" gelöst, wie man unten sieht, bezweifle aber, dass das so gedacht ist.

Im wesentlichen habe ich folgenden Code:

Code: Alles auswählen

QVBoxLayout *lay = new QVBoxLayout;
lay->addWidget(meinWidget);
lay->addWidget(new QSlider);
QWidget *w = new QWidget;
w->setLayout(lay);
setCentralWidget(w);
Was da passiert, ist dass der QSlider den gesamten Raum einnimmt.

"meinWidget" ist ein Sohn von QWidget und benutzt seinen Bereich, um etwas zu zeichen. Es kümmert sich nicht wirklich darum, welche Größe es bekommt, überschreibt also weder die minimum/maximum...-Methoden noch sizeHint, sizePolicy oder sonstwas.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ich habs jetzt mal mit folgenden Code probiert und es läuft so, wie du es dir vorstellst. Ein direkter Nachbau deines Codes hat nicht funktioniert.

Code: Alles auswählen

QMainWindow *main=new QMainWindow();
main->show();
	
QWidget *wdg=new QWidget(main);
main->setCentralWidget(wdg);
	
QHBoxLayout *layout=new QHBoxLayout(wdg);
	
QFrame *frame=new QFrame();
frame->setFrameShadow(QFrame::Sunken);
frame->setFrameStyle(QFrame::StyledPanel);
	
layout->addWidget(frame);
layout->addWidget(new QSlider());
[code]
Einmaliger
Beiträge: 48
Registriert: 22. Juli 2006 11:42

Beitrag von Einmaliger »

Danke für die Antwort. So geht es jetzt tatsächlich. Keine Ahnung, was bei mir falsch war. :roll:
Einmaliger
Beiträge: 48
Registriert: 22. Juli 2006 11:42

Beitrag von Einmaliger »

Jetzt aber:

Wenn man statt eines einfachen QSlider rechts etwas verwendet, das seine Größe ändern kann, wie zum Beispiel ein VBoxLayout, teilt das HBoxLayout die Breite gleichmäßig auf. Um sicherzugehen, dass das linke Widget immer so groß wie möglich ist, habe ich nun die Funktion sizeHint überschrieben (MeinWidget ist natürlich nur ein Beispielname):

Code: Alles auswählen

QSize MeinWidget::sizeHint() const
{
    return maximumSize();
}
So wird dieses Widget tatsächlich wann immer möglich maximiert und alles andere in der Mindestgröße dargestellt.

Das dürfte jetzt doch die sauberste Lösung sein, oder?
Antworten