2017-04-03 2 views
-2

Ich arbeite für ein Projekt in meinem Abschluss und ich habe ein Problem mit der GUI.Qt: setGeometry nicht am Start der App Größe ändern

Ich habe die Platzierung der verschiedenen Widgets in einem separaten Projekt getestet, um den Code, den ich versuche, zu vereinfachen.

Hier ist mein Problem: Ich habe eine überladene resizeEvent erstellt, um alle meine Widgets zu ändern. Es funktioniert großartig, mit einer Ausnahme:

Nach dem Start von meinem Testprogramm, die Widgets sind nicht gut dimensioniert, ich brauche das Fenster einmal manuell, um die Größe der resizement zu zwingen, selbst wenn die setGeometry Anrufe sind in der Konstruktor wie im folgenden Code.

.h

MainWindow.h 
------------- 
#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <QPushButton> 
#include <QGridLayout> 
#include <QGroupBox> 

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 
    void resizeEvent (QResizeEvent * event); 

private: 
    Ui::MainWindow *ui; 

    QGroupBox *g1; 
    QGroupBox *g2; 
    QPushButton *but2; 
    QGridLayout *lay; 
}; 

#endif // MAINWINDOW_H 

CPP

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 

    this->lay = new QGridLayout(); 
    this->g1 = new QGroupBox("g1"); 
    this->g2 = new QGroupBox("g2"); 
    this->but2 = new QPushButton("But2"); 
    this->lay->addWidget(g1, 0, 0, 1, 1); 
    this->lay->addWidget(but2, 0, 1, 1, 1); 
    this->lay->addWidget(g2, 1, 0, 1, 2); 
    this->g1->setBaseSize(60, 60); 
    this->g2->setBaseSize(60, 60); 

    this->ui->centralWidget->setLayout(lay); 
    this->ui->centralWidget->setMinimumSize(100, 100); 

    this->but1->setHidden(true); 

    this->g1->setGeometry(5, 1, (this->ui->centralWidget->width())55, (this->ui->centralWidget->height())-83); 
    this->but2->setGeometry(this->g1->width()+10 , 6, 40, (this->ui->centralWidget->height())-88); 
    this->g2->setGeometry(5, this->g1->height()+5, (this->ui->centralWidget->width())-10, 70); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

void MainWindow::resizeEvent (QResizeEvent * event) 
{ 
    this->g1->setGeometry(5, 1, (this->ui->centralWidget->width())-55, (this->ui->centralWidget->height())-89); 
    this->but2->setGeometry(this->g1->width()+10 , 6, 40, (this->ui->centralWidget->height())-88); 
    this->g2->setGeometry(5, this->g1->height()+5, (this->ui->centralWidget->width())-10, 70); 
} 

Ich versuche, eine Lösung zu finden, so dass die Widgets von Anfang an gut dimensioniert sind,

UPDATE Hier sind zwei Bilder:

Vor

before resize

Nach

after resize

Das Problem der Größe der Größe das ist, wenn nichts da drinnen ist, die QGroupBox nehmen Sie nur die Größe der Schaltfläche daneben, ich möchte es von Anfang an größer sein

+1

Ich würde dringend empfehlen, das 'resizeEvent' nicht zu überschreiben, sah dies während eines großen Projekts und es führte zu allen Arten von Problemen. Versuchen Sie stattdessen, das gewünschte Aussehen durch Layouts und Abstandhalter zu erreichen, was normalerweise möglich ist und am Ende viel glatter ist. Wenn Sie Screenshots des ursprünglichen und des gewünschten Aussehens hinzufügen, könnte Ihnen auch jemand dabei helfen. – Bowdzone

+0

ich stimme zu, aber ich denke nicht, dass das Problem hier das resizeevent ist, weil es gut funktioniert, wenn ich mein Fenster verändere. Ich habe es überschrieben, da die Größe meines differents Layout hängt davon ab, welche von ihnen sind versteckt oder sichtbar. Das Problem, das ich hier habe, ist, dass beim Start der App scheint, dass die setGeometry nicht ausgeführt wird, auch wenn es das Ende des Konstruktors ist. Ich habe versucht, einige Zeilen wie QCoreApplication :: processEvent oder widget.update für alle Widgets in den Fenstern hinzuzufügen, aber nichts passiert. –

+0

Ja, aber es ist immer noch ein XY-Problem. Die Geometrie der Widgets hängt von anderen Widgets ab, was bedeutet, dass alles einmal gemalt werden muss, bevor man es in der Größe verändern kann, denke ich. Ich würde also einen anderen Weg finden, der Ihnen weniger Kopfschmerzen bereiten sollte. – Bowdzone

Antwort

0

Statt setGeometry shou ld verwenden, um den Streck-Faktor beim Hinzufügen von Widgets auf das Layout (und vielleicht in resizeEvent() zu), wie ...

int col = 0, row = 0; 
int stretch = 100 * (this->ui->centralWidget->width()-55.0)/this->ui->centralWidget->width(); 
this->lay->setColumnStretch(col, stretch); 
stretch = 100 * (this->ui->centralWidget->height())-89.0)/this->ui->centralWidget->height(); 
this->lay->setRowStretch(row, stretch); 

gleiche Weise für die anderen Widgets.

Verwandte Themen