Seite 1 von 1
Größenveränderung von QWidget im Hauptfenster
Verfasst: 14. September 2008 14:00
von rafilis1982
Ich habe in meinem Hauptfenster zwei QHBoxLayouts im oberen befindet sich ein Widget und im unteren zwei.
Wie kann ich nun mit Qt eine Art Leiste, wie man sie aus verschiedenen Windows Fenstern kennt, erzeugen, mit der ich die Größe der zwei QHBoxLayouts als auch der unteren Qwidgets variieren kann?
Verfasst: 14. September 2008 14:24
von FaS
Schau dir die Formularsymbolleiste im Designer an...
Verfasst: 14. September 2008 14:43
von rafilis1982
Ich hab meine GUI ohne den Designer geschrieben.
Auch ein erster Blick in den Designer hat mir nicht weitergeholfen. Ein Blick in die Beispiele zeigte das man das wohl mit DockWidgtes machen kann.
Jedoch suche ich nur eine Funktion die lediglich eine Größenveränderung zulässt.
Gib es sowas?
Für einen genaueren Tipp wäre ich dankbar...
Verfasst: 14. September 2008 14:52
von hilefoks
Schau dir mal
http://doc.trolltech.com/4.4/qsplitter.html an. Das ist, glaube ich, was du suchst.
MfG,
Hilefoks
Verfasst: 14. September 2008 14:54
von FaS
rafilis1982 hat geschrieben:Ich hab meine GUI ohne den Designer geschrieben.
Aber für GUI-Fragen ist es meist am effektivsten diesen heranzuziehen, z.B. auch nützlich um mit sizePolicies herumzuexperimentieren usw.
rafilis1982 hat geschrieben:Auch ein erster Blick in den Designer hat mir nicht weitergeholfen.
In der erwähnten Formularsymbolleiste (oder dem gleichnamigen Menü) wird man sofort fündig (gibt doch nur 8 Symbole..). Aber bitteschön: Das Ding nennt sich QSplitter
MfG,
FaS
Verfasst: 14. September 2008 16:04
von rafilis1982
Erst mal vielen Dank für die Antworten.
Ich hab das ganze mal so implementiert wie ich es mir zuerst gedacht habe.
Leider kriege ich nun ein völlig verzerrtes Bild meines Hauptfensters.
Anbei mal der Code für das Hauptfenster:
Code: Alles auswählen
//// Set-up main widgets ////
QWidget *mainWindow = new QWidget();
QHBoxLayout* mainWindowLayout = new QHBoxLayout();
//////////////////////////////////////////////////////////////////////////
//// Mitte oberhalb (OpenGl,Slider) - horizontales Layout
QWidget *openGl = new QWidget();
QHBoxLayout *openGlLayout = new QHBoxLayout();
openGlLayout->setMargin(10);
openGlLayout->setSpacing(10);
//openGlLayout->setSizeConstraint(QLayout::SetNoConstraint);
glmesh = new GLMesh(openGl,settings);
glmesh->setMinimumWidth(600);
glmesh->setMinimumHeight(448);
openGlLayout->addWidget(glmesh);
clipping = new QSlider(openGl);
clipping->setMinimum(-100);
clipping->setMaximum(100);
clipping->setPageStep(5);
clipping->setValue(0);
clipping->setToolTip("Clipping");
connect(clipping, SIGNAL(valueChanged(int)), glmesh, SLOT(setClipping(int)));
openGlLayout->addWidget(clipping);
openGl->setLayout(openGlLayout);
//////////////////////////////////////////////////////////////////////////
//// Mitte unten (logger,treewidget) - horizontales Layout
QWidget *logWnd = new QWidget();
QHBoxLayout *logWndLayout = new QHBoxLayout();
QSplitter *logWndlay = new QSplitter(logWnd);//new
//logWndLayout->setSizeConstraint(QLayout::SetNoConstraint);
logWndLayout->setMargin(10);
logWndLayout->setSpacing(10);
logMesh = new logger(logWnd);//QTreeWidget for Error Checking
treeWidget = new QtDOMParser(logWnd);
logWndLayout->addWidget(treeWidget);
logWndLayout->addWidget(logMesh);
logWnd->setLayout(logWndLayout);
logWndlay->addWidget(treeWidget);//new
logWndlay->addWidget(logMesh);//new
//////////////////////////////////////////////////////////////////////////
//// Vertikales Layout rechts (bestehend aus beiden oberen Layouts)
QWidget *vboxRight = new QWidget();
QVBoxLayout *vboxRightLayout = new QVBoxLayout();
QSplitter *vBoxRightLay = new QSplitter(vboxRight);//new
vboxRightLayout->addWidget(openGl);
vboxRightLayout->addWidget(logWnd);
vboxRightLayout->setStretchFactor(openGl,200);
vBoxRightLay->addWidget(openGl);//new
vBoxRightLay->addWidget(logWnd);//new
vboxRight->setLayout(vboxRightLayout);
//////////////////////////////////////////////////////////////////////////
//// Put them all together...
mainWindowLayout->addWidget(vboxRight);
mainWindow->setLayout(mainWindowLayout);
setCentralWidget(mainWindow);
Wie man vlt erkennen kann, hab ich die neuen Stellen mit "new " gekennzeichnet.
Ich hoffe mir kann jmd sagen, wo der Fehler liegt. Ich würd schon ganz gerne auch das Layout behalten, weil man damit den StretchfFaktor einstellen kann.
Wenn es dazu eine Alternative gibt, auch Recht

Verfasst: 14. September 2008 16:22
von FaS
Ein QSplitter ist wie ein QHBoxLayout bzw. QVBoxLayout, mit dem Unterschied, dass die beinhalteten Elemente mit einerm splitter handle getrennt werden. Du musst die jew. Box-Layouts durch QSplitter ersetzen, dieser hat auch Funktionen wie addWidget oder setStretchFactor.
Verfasst: 14. September 2008 16:53
von rafilis1982
Ok, hab ich getan.
Nur leider sind die Widgets nun hintereinander, anstatt wie vorher unter - bzw. nebeneinander.
Woran kann das liegen?
Hier mal der aktualisierte Code:
Code: Alles auswählen
//// Set-up main widgets ////
QWidget *mainWindow = new QWidget();
QHBoxLayout* mainWindowLayout = new QHBoxLayout();
//////////////////////////////////////////////////////////////////////////
//// oberhalb (OpenGl,Slider) - horizontales Layout
QWidget *openGl = new QWidget();
QHBoxLayout *openGlLayout = new QHBoxLayout();
openGlLayout->setMargin(10);
openGlLayout->setSpacing(10);
//openGlLayout->setSizeConstraint(QLayout::SetNoConstraint);
glmesh = new GLMesh(openGl,settings);
glmesh->setMinimumWidth(600);
glmesh->setMinimumHeight(448);
clipping = new QSlider(openGl);
clipping->setMinimum(-100);
clipping->setMaximum(100);
clipping->setPageStep(5);
clipping->setValue(0);
clipping->setToolTip("Clipping");
connect(clipping, SIGNAL(valueChanged(int)), glmesh, SLOT(setClipping(int)));
openGlLayout->addWidget(glmesh);
openGlLayout->addWidget(clipping);
openGl->setLayout(openGlLayout);
//////////////////////////////////////////////////////////////////////////
//// unten (logger,treewidget) - horizontales Layout
QWidget *logWnd = new QWidget();
//QHBoxLayout *logWndLayout = new QHBoxLayout();
QSplitter *logWndLayout = new QSplitter(logWnd);
//logWndLayout->setSizeConstraint(QLayout::SetNoConstraint);
//logWndLayout->setMargin(10);
//logWndLayout->setSpacing(10);
logMesh = new logger(logWnd);//QTreeWidget for Error Checking
treeWidget = new QtDOMParser(logWnd);
logWndLayout->addWidget(treeWidget);
logWndLayout->addWidget(logMesh);
//logWnd->setLayout(logWndLayout);
logWndLayout->setOrientation(Qt::Horizontal);
//////////////////////////////////////////////////////////////////////////
//// Vertikales Layout (beide oberen Layouts zusammen)
QWidget *vboxRight = new QWidget();
//QVBoxLayout *vboxRightLayout = new QVBoxLayout();
QSplitter *vboxRightLayout = new QSplitter(vboxRight);
vboxRightLayout->addWidget(openGl);
vboxRightLayout->addWidget(logWnd);
//vboxRightLayout->setStretchFactor(openGl,200);
vboxRightLayout->setStretchFactor(0,200);
//vboxRight->setLayout(vboxRightLayout);
vboxRightLayout->setOrientation(Qt::Vertical);
//////////////////////////////////////////////////////////////////////////
//// Put them all together...
mainWindowLayout->addWidget(vboxRight);
mainWindow->setLayout(mainWindowLayout);
setCentralWidget(mainWindow);
Verfasst: 14. September 2008 17:27
von upsala
Nur leider sind die Widgets nun hintereinander, anstatt wie vorher unter - bzw. nebeneinander.
Woran kann das liegen?
Daran, daß du die Doku von QSplitter nicht gelesen hast...
Verfasst: 14. September 2008 17:36
von rafilis1982
Schön , dass du weisst was ich gelesen habe oder nicht...
Im früheren Leben Hellseher gewesen?
Offensichtlich hast du Sie ja dann genau studiert und anstatt so einen flapsigen Kommentar zu geben, könntest du mir auch freundlicherweise mitteilen woran das liegt?
Ganz ehrlich, wenn dann lieber keinen Kommentar als so einen, der bringt niemanden weiter....
Verfasst: 14. September 2008 17:44
von rafilis1982
Ok, hat sich erledigt.
Mittlerweile bin ich selbst auf den Kniff gekommen und habe einfach neben den Layouts auch die Widgets entfernt und durch Qsplitter ersetzt...