Größenveränderung von QWidget im Hauptfenster

Alles rund um die Programmierung mit Qt
Antworten
rafilis1982
Beiträge: 34
Registriert: 6. Juni 2008 14:44

Größenveränderung von QWidget im Hauptfenster

Beitrag 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?
FaS
Beiträge: 184
Registriert: 25. Mai 2006 19:48
Kontaktdaten:

Beitrag von FaS »

Schau dir die Formularsymbolleiste im Designer an...
rafilis1982
Beiträge: 34
Registriert: 6. Juni 2008 14:44

Beitrag 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...
hilefoks
Beiträge: 144
Registriert: 13. März 2008 16:09

Beitrag von hilefoks »

Schau dir mal http://doc.trolltech.com/4.4/qsplitter.html an. Das ist, glaube ich, was du suchst.

MfG,
Hilefoks
FaS
Beiträge: 184
Registriert: 25. Mai 2006 19:48
Kontaktdaten:

Beitrag 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 :wink:

MfG,
FaS
rafilis1982
Beiträge: 34
Registriert: 6. Juni 2008 14:44

Beitrag 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 :wink:
FaS
Beiträge: 184
Registriert: 25. Mai 2006 19:48
Kontaktdaten:

Beitrag 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.
rafilis1982
Beiträge: 34
Registriert: 6. Juni 2008 14:44

Beitrag 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);
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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...
rafilis1982
Beiträge: 34
Registriert: 6. Juni 2008 14:44

Beitrag 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....
rafilis1982
Beiträge: 34
Registriert: 6. Juni 2008 14:44

Beitrag 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...
Antworten