ich scheiter gerade an dem versuch eine "Sidebar" für mein Programm zu bauen. Das Gerüst steht, aber es gibt noch ungereimtheiten. (Qt 4.6.2.)
Ich habe eine QScrollArea in mein Hauptlayout (HBox) gepackt. Um meine GroupBoxen in die Area zu schieben gibt es die Methode setLayout bei der Area. Diese habe ich genutzt und musste feststellen, dass sich das Layout in der Area immer an der Größe der Area orientiert und somit NIE ein Scrollbar auftaucht. Der Inhalt wird einfach gestaucht.
Kann ich das mit einer Methode umgehen/abschalten?
Kurzaufbau derzeit:
QWidget -> QHBoxLayout -> QScrollArea -> QGroupBox -> QVBoxLayout -> QGroupBox + QGroupBox ...
Ich habe für mein Work-A-Round nun anstatt das Layout zu setzen über setWidget der Area eine GroupBox hinzugefügt in der das Layout hängt in dem ich die anderen GB's platziert habe.
Jetzt taucht der Scrollbar in der Area auf und ich kann endlich scrollen. Haken bei der Sache ist, das die GB in der Area ihre Initialisierungsgröße beibehält.
Warum das so ist weiß ich nicht, es ist mir aufgefallen, weil alle GB's in dem Layout checkable und connected mit einer Funktion sind, die die Sender-GB auf 20pxl verkleinert.
Halt eine Sidebar wie man sie von vielen Programmen kennt
Sprich, wenn ich all GB's verkleiner (uncheck), bleibt die äußere GroupBox bei der Initialisierungsgröße und es ist immernoch der Scrollbar der Area zu sehen - was allerdings nicht mehr nötig wäre.
Mein Quelltext zu dem Vorhaben schaut wie folgt aus:
Code: Alles auswählen
...
gridLayer = new QHBoxLayout(this);
scrollArea = new QScrollArea;
scrollArea->setLayoutDirection(Qt::RightToLeft);
scrollArea->setContentsMargins(0,0,0,0);
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
scrollArea->setFixedWidth(220);
scrollArea->setFrameShape(QFrame::NoFrame);
scrollGrp = new QGroupBox;
scrollGrp->setLayoutDirection(Qt::LeftToRight);
scrollGrp->setFlat(true);
scrollGrp->setContentsMargins(0,0,0,0);
scrollGrp->setFixedWidth(200);
scrollLayer = new QVBoxLayout();
scrollLayer->addWidget(recordGrp,0,Qt::AlignTop);
scrollLayer->addWidget(cameraGrp,0,Qt::AlignTop);
scrollLayer->addWidget(optionGrp,0,Qt::AlignTop);
scrollLayer->addWidget(scaleGrp,0,Qt::AlignTop);
scrollLayer->addWidget(statisticGrp,0,Qt::AlignTop);
scrollGrp->setLayout(scrollLayer);
scrollArea->setWidget(scrollGrp);
gridLayer->addWidget(scrollArea);
...
Grüße,
Pixtar
NACHTRAG: Ich sehe gerade hier, hier und hier, dass mein Workaround schon okay ist. Das Problem ist aber, dass QScrollArea wohl noch nicht das ist, für das man es hält. Komme somit wohl ums Ableiten nicht herum. Andere Ideen sind trotzdem gern willkommen.