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

Alles rund um die Programmierung mit Qt
Antworten
TheMetalManiac
Beiträge: 19
Registriert: 21. Juni 2007 15:46

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

Beitrag 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
Zuletzt geändert von TheMetalManiac am 30. August 2007 13:47, insgesamt 2-mal geändert.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Bastel dir im Designer das was Du haben willst und schau dir das Ergebnis an.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
kitov
Beiträge: 36
Registriert: 29. November 2006 12:24

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

Beitrag von kitov »

setLayout(this) brauchst du nicht , weil du schon Elternwidget gesetzt
hast , mit new Layout(this) .
TheMetalManiac
Beiträge: 19
Registriert: 21. Juni 2007 15:46

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

Beitrag 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
TheMetalManiac
Beiträge: 19
Registriert: 21. Juni 2007 15:46

setLayout()

Beitrag von TheMetalManiac »

@ kitov : Danke für den Tipp, habe es auskommentiert aber es bleibt die Warnung.
Hatte das mit dem setLayout aus dem Assistant...
kitov
Beiträge: 36
Registriert: 29. November 2006 12:24

Re: setLayout()

Beitrag von kitov »

Von welcher Klasse wird deine geerbt ?
zeig bitte die Constuctorimplementation .
TheMetalManiac
Beiträge: 19
Registriert: 21. Juni 2007 15:46

Beitrag 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
RD1978
Beiträge: 84
Registriert: 5. Juni 2007 08:00
Wohnort: Stralsund (DDR)

Beitrag 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
TheMetalManiac
Beiträge: 19
Registriert: 21. Juni 2007 15:46

Es hat geklappt!!!

Beitrag 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
RD1978
Beiträge: 84
Registriert: 5. Juni 2007 08:00
Wohnort: Stralsund (DDR)

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