Layout-Problem -> dringend

Alles rund um die Programmierung mit Qt
Antworten
kleineSchildy
Beiträge: 76
Registriert: 16. September 2004 18:29
Wohnort: Dresden

Layout-Problem -> dringend

Beitrag von kleineSchildy »

Hallo,

ich habe ein Problem mit meinem Layout. Die Fenstergröße passt sich den Widgets leider nicht an.

Ich erkläre kurz, was das Fenster macht. Beim Öffnen des Fenster habe ich eine ComboBox, wo ein Element ausgewählt wird. Danach wird eine entsprechende GroupBox im Layout erstellt.

Das Problem ist, dass nach dem Hinzufügen der neuen GroupBox sich das Fenster der neuen Größe nicht anpasst.

Hier mal der entsprechende Code dazu. Evt. liegt der Fehler ja an meinem Aufbau des Layouts.

Code: Alles auswählen

void MyChild::createSourceTophatWindow(){
	
    setWindowTitle(tr("Tophat"));

    srcTopMainLayout = new QGridLayout;
	 
    createGroupBoxTophatType();
        
    setLayout(srcTopMainLayout);
}

Code: Alles auswählen

void MyChild::createGroupBoxTophatType(){
    
	srcTopTypeGroupBox = new QGroupBox(tr("Illumination Type"));
	srcTopTypeLayout = new QGridLayout;
	
	srcTopTypeComboBox = new QComboBox;
		    srcTopTypeComboBox->addItem("Annular");
		    srcTopTypeComboBox->addItem("Circle");
		    srcTopTypeComboBox->addItem("Multi-Quasar");
		    srcTopTypeComboBox->addItem("Quasar");
		    
    srcTopTypeLayout->addWidget(srcTopTypeComboBox,0,0);
	
	srcTopTypeGroupBox->setLayout(srcTopTypeLayout);
                
    srcTopMainLayout->addWidget(srcTopTypeGroupBox,0,0);

	
	//Connections
	connect(srcTopTypeComboBox, SIGNAL(activated(QString)), this, SLOT(createGroupBoxTophatSigma(QString)));	 
}

Code: Alles auswählen

void MyChild::createGroupBoxTophatSigma(QString type){
	
	//existierende GroupBox löschen
	if(srcTopSigmaGroupBox){
        srcTopMainLayout->removeWidget(srcTopSigmaGroupBox);
        delete srcTopSigmaGroupBox;
    }
    
    srcTopSigmaGroupBox = new QGroupBox(tr("Sigma"));
   QGridLayout* srcTopSigmaGroupBoxLayout = new QGridLayout();
	
	if(type == "Circle"){
	    qDebug("Circle");
		QLineEdit* srcTopSigmaLineEdit     = new QLineEdit;
		srcTopSigmaGroupBoxLayout->addWidget(srcTopSigmaLineEdit,0,0);
		srcTopSigmaGroupBox->setLayout(srcTopSigmaGroupBoxLayout);  
    }
    else{
        if ((type == "Annular") || (type == "Quasar")){
            qDebug("Annular  oder Quasar");
            QLabel*    srcTopSigmaInnerLabel    = new QLabel("Inner:");
            QLabel*    srcTopSigmaOuterLabel    = new QLabel("Outer:");
            QLineEdit* srcTopSigmaInnerLineEdit = new QLineEdit;
            QLineEdit* srcTopSigmaOuterLineEdit = new QLineEdit;
            srcTopSigmaGroupBoxLayout->addWidget(srcTopSigmaInnerLabel,0,0);
		    srcTopSigmaGroupBoxLayout->addWidget(srcTopSigmaInnerLineEdit,0,1);
		    srcTopSigmaGroupBoxLayout->addWidget(srcTopSigmaOuterLabel,1,0);
		    srcTopSigmaGroupBoxLayout->addWidget(srcTopSigmaOuterLineEdit,1,1);
		    srcTopSigmaGroupBoxLayout->setColumnMinimumWidth(1,100);
		    srcTopSigmaGroupBox->setLayout(srcTopSigmaGroupBoxLayout);
	    }
	    else{
            qDebug("Multi-Quasar");
 	    }
    }
	    
    srcTopMainLayout->addWidget(srcTopSigmaGroupBox);
   setLayout(srcTopMainLayout);
}
ich habe es schon mit "resize" in der letzten Methode an letzter Stelle versucht ebenso mit erneuten "setLayout" (siehe Code). Beides brachte jedoch keinen Effekt. Man sieht zwar die GroupBox mit ihrem Titel, aber der Inhalt der GroupBoxen hat nicht die richtige Größe. Nach einem winzigen Ziehen am Fenster wird der Inhalt plötzlich richtig dargestellt.

Stimmt etwas im Aufbau meines Layouts nicht? Habe ich etwas grundlegendes nicht beachtet? Im Qt-Buch habe ich leider auch nichts zu dem Thema gefunden und die in der Suche vorgeschlagenen Sachen habe ich schon versucht :( .

Vielen Dank für eure Hilfe.

Viele Grüße
Jana
Zuletzt geändert von kleineSchildy am 27. Dezember 2007 10:17, insgesamt 1-mal geändert.
kleineSchildy
Beiträge: 76
Registriert: 16. September 2004 18:29
Wohnort: Dresden

Beitrag von kleineSchildy »

ok, durch setSizeConstraint() in der letzten Methode:

Code: Alles auswählen

    srcTopMainLayout->addWidget(srcTopSigmaGroupBox);
    srcTopMainLayout->setSizeConstraint(QLayout::SetMinimumSize);
    setLayout(srcTopMainLayout);
bin ich jetzt soweit, dass das Layout scheinbar richtig dargestellt wird. Leider wird es vom Fenster immernoch abgeschnitten und ich finde einfach nicht die passende Funktion, um die Fenstergröße dem Layout anzupassen :(
kleineSchildy
Beiträge: 76
Registriert: 16. September 2004 18:29
Wohnort: Dresden

Beitrag von kleineSchildy »

hat denn keiner Idee, was da schief läuft? :cry:

Viele Grüße und frohe Weihnachten
Jana
kleineSchildy
Beiträge: 76
Registriert: 16. September 2004 18:29
Wohnort: Dresden

Beitrag von kleineSchildy »

Hallo,

scheinbar scheinen sich alle Funktionen, die ich im Widget erstellen nur auf das MainLayout zu beziehen.

Wenn ich zum Beispiel folgendes Connect einbauen:

Code: Alles auswählen

connect(srcTopCancelPushButton, SIGNAL(clicked()), this,SLOT(hide()));
wird nur das Layout ausgeblendet, aber nicht das ganze Fenster :(

Kann mir jemand sagen, was ich da falsch gemacht habe?

Meine Header-Datei sieht so aus:

Code: Alles auswählen

#ifndef MYCHILD_H
#define MYCHILD_H

#include <QWidget>

class QRadioButton;
class MyMainWindow;
class QLineEdit;
class QPushButton;
class QGroupBox;
class QGridLayout;
class QComboBox;

class MyChild : public QWidget
{
    Q_OBJECT
    
    	
public:
    MyChild();
    
    void createSessionWindow();
    void createSourceWidget(int);
    
    QRadioButton*  tophatRadioButton;
    QRadioButton*  processRadioButton;
    QRadioButton*  synthesRadioButton;
    QLineEdit*        srcProBitmapLineEdit;
    QPushButton*   srcProCancelPushButton;
    
    QComboBox*     srcTopTypeComboBox;
    QComboBox*     srcSynTypeComboBox;
    
    QList<float>*  srcTopSigmaList;
    
private slots:
    void openFileDialog();
    void createProFile();
    void createTopFile();
    void createGroupBoxTophatSigma(QString);
    void createGroupBoxSynSigma(QString);
    
private:
    QGroupBox*    srcTopTypeGroupBox;
    QGroupBox*    srcTopSigmaGroupBox;
    QGroupBox*    srcTopOtherGroupBox;
    QGroupBox*    srcTopButtonGroupBox;
    QGroupBox*    srcSynTypeGroupBox;

    QGridLayout*  srcTopMainLayout;
    QGridLayout*  srcSynMainLayout;
    
	void createGroupBoxTophatType();
	void createGroupBoxTophatButton();
	void createGroupBoxSynModel();
	void createGroupBoxSynType();
	void createSourceTophatWindow();
	void createSourceProcessedWindow();
	void createSourceSynthesizedWindow();

};
#endif
und der Konstruktor so:

Code: Alles auswählen

MyChild::MyChild(){
				   
    srcTopSigmaGroupBox  = 0;
	srcTopOtherGroupBox  = 0;
	srcTopButtonGroupBox = 0;
    setAttribute(Qt::WA_DeleteOnClose);
}
Ich finde leider keinen Fehler bzw. weiß nicht, warum mein Programm so reagiert :cry:

Vielen Dank schonmal für eure Hilfe.

Viele Grüße
Jana
Antworten