Seite 1 von 1

[gelöst] Problem bzw. Warnung bei Layout-Platzierung

Verfasst: 29. August 2007 16:26
von TheMetalManiac
Hallo mal wieder...

Es geht um einen kleinen Schönheitsfehler bei den Layouts in QT.
Ich habe 3 Layouts und möchte diese in ein QWidget einbauen:

Code: Alles auswählen

layout = new QVBoxLayout(this);
buttonLayoutTime = new QHBoxLayout(this);
buttonLayoutSpeed = new QHBoxLayout(this);
....
runStopButton = new QToolButton();
....
buttonLayoutTime->addWidget(runStopButton);
....
layout->addLayout(buttonLayoutTime);
layout->addLayout(buttonLayoutSpeed);
.....
setLayout(layout);
Es kommt immer die Warnung:
"QWidget::setLayout: Attempting to add QLayout "" to PlotW "", which already has a layout "

PlotW ist eine Klasse, die von QWidget erbt.

Im Assitant steht, dass jedes Layout bereits ein Layout besitzt und dieses erst gelöscht werden muss, bevor ein neues eingebracht werden kann (wenn ich das richtig verstanden habe). Also löschen ist aber schonmal garnicht gut, dann stürzt es nämlich ab :).

Vielleicht hatte ja jemand schonmal das Problem?!

Danke schon mal für eure Hilfe!!!

TheMetalManiac

Verfasst: 30. August 2007 07:26
von macman
Bastel dir im Designer das was Du haben willst und schau dir das Ergebnis an.

Re: Problem bzw. Warnung bei Layout-Platzierung in einem QWi

Verfasst: 30. August 2007 09:26
von kitov
setLayout(this) brauchst du nicht , weil du schon Elternwidget gesetzt
hast , mit new Layout(this) .

versucht...aber nicht der gewünschte effekt eingetreten

Verfasst: 30. August 2007 10:09
von TheMetalManiac
Hallo nochmal.

Habe deinen Tipp ausprobiert...mit dem Ergebnis, dass ein neues Widget erstellt wird und dort die Layouts genauso eingebunden werden wie bei mir.

Der einzige Unterschied ist, dass der oben beschriebene Code bereits in einer Klasse geschrieben ist, die von QWidget erbt. Daher auch in den Klammern immer "this".

Das Problem ist (wie auch schon im Assistant geschrieben), dass das QWidget bereits ein Layout hat. Ich würde es ja auch gerne benutzen, wenn ich denn wüsste wie :).
Wie schon geschrieben ein löschen dieses Layout verursacht einen Absturz.

Vielleicht hast du / habt ihr noch eine andere Idee?!

Danke,

TheMetalManiac

setLayout()

Verfasst: 30. August 2007 10:14
von TheMetalManiac
@ kitov : Danke für den Tipp, habe es auskommentiert aber es bleibt die Warnung.
Hatte das mit dem setLayout aus dem Assistant...

Re: setLayout()

Verfasst: 30. August 2007 10:30
von kitov
Von welcher Klasse wird deine geerbt ?
zeig bitte die Constuctorimplementation .

Verfasst: 30. August 2007 11:13
von TheMetalManiac
Hier der gewünschte Code:

Header:

Code: Alles auswählen


class PlotW : public QWidget
{
	Q_OBJECT
	
public:
	///Constructor
	///
    /// inits PlotW with default values
    ///
    PlotW(port_data port[MAX_PORT_NUMBER],int i);
    
    ///Destructor
	///
    /// deletes DataPlot- Object
    ///
	~PlotW();
...
CPP:

Code: Alles auswählen

PlotW::PlotW(port_data port[MAX_PORT_NUMBER],int i)
{
	
	port_data *port_array;
	port_array = port; 
	plot = new DataPlot(&(*port_array),i,this);
	init();
}

//initialize the PlotW
void PlotW::init()
{	
	layout = new QVBoxLayout(this);
	buttonLayoutTime = new QHBoxLayout(this);
	buttonLayoutSpeed = new QHBoxLayout(this);
        ....
        //GUI:
	//1st Row:
	buttonLayoutTime->addWidget(descrButton);	
	buttonLayoutTime->addWidget(refreshButton1);
	buttonLayoutTime->addWidget(refreshButton2);
	buttonLayoutTime->addWidget(descrTime);
	buttonLayoutTime->addWidget(timeSlider);
	buttonLayoutTime->addWidget(valueFromSlider);
	//2nd Row:
	buttonLayoutSpeed->addWidget(fixY);
	buttonLayoutSpeed->addWidget(descrFps);
	buttonLayoutSpeed->addWidget(fpsSlider);
	buttonLayoutSpeed->addWidget(timeFromSlider);
	
	layout->addLayout(buttonLayoutTime);
	layout->addLayout(buttonLayoutSpeed);
	
	layout->addWidget(plot);
        ....
Soweit die wesentlichen Abschnitte.

Danke nochmal für die Hilfe hier!!!

TheMetalManiac

Verfasst: 30. August 2007 11:50
von RD1978
Hallo,

versuch es mal mit:

Code: Alles auswählen

layout = new QVBoxLayout( this );
buttonLayoutTime = new QHBoxLayout( 0 );
buttonLayoutSpeed = new QHBoxLayout( 0 );

layout->addLayout( buttonLayoutTime );
layout->addLayout( buttonLayoutSpeed );

//...
MfG RD1978

Es hat geklappt!!!

Verfasst: 30. August 2007 13:36
von TheMetalManiac
Super!!!

So kommt keine Warnung mehr und trotzdem ist alles richtig angeordnet!

Vllt. kannst du, RD1978, noch erklären warum es geht?

Herzlichen Dank!!!!

TheMetalManiac

Verfasst: 30. August 2007 14:15
von RD1978
Weil ein Widget nur ein Layout, aber ein Layout wiederum mehrere Layouts aufnehmen kann. Wenn du "new QVBoxLayout( this )" schreibst, dann übernimmt das Widget (welches mit this gemeint ist) dieses Layout. Das ist das selbe, wenn Du "setLayout( layout )" aufrufst. Wenn Du danach nochmal ein oder mehere Layouts erzeugst und an diese "this" übergibst, kommen diese Warnungen, weil das Widget (this) schon ein Layout hat.

Mit "new QHBoxLayout()" wird im Prinzip der erste Kontstuktor aufgerufen.

Aus der Doku...
QHBoxLayout::QHBoxLayout()
Constructs a new horizontal box. You must add it to another layout.
Ich hoffe, dass ich das halbwegs vernünftig erklären konnte. :?

MfG RD1978