Widgets aus GridLayout rauspopeln

Alles rund um die Programmierung mit Qt
Antworten
adziu24
Beiträge: 7
Registriert: 3. November 2013 10:40

Widgets aus GridLayout rauspopeln

Beitrag von adziu24 »

Moin Leute hätte da ne kurze Frage.. vielleicht hat ja jemand ne Ahnung wie das geht ^^

Situation:
Ich füge x Widgets der selben Geschmackssorte ( in diesem Fall ) zum GridLayout hinzu, ok kein problem,
aber ich möchte diese aus irgendeinem verrückten Grund wieder entfernen und als
normale Widget(s) Fenster anzeigen lassen, wie geht das?

Code: Alles auswählen

... ganz viel Code, um zu den items zu gelangen ( klappt & getestet )
QLayoutItem *item = gridlayout->takeAt(i); // hier spuckt er mir die items brav aus... oder anders besser? Ich brauch meine alten Widgets  :cry: 
???
PROFIT! // Normale Fenster
delete item;
Momentanes Resultat:
Widgets werden erfolgreich aus dem GridLayout entfernt, aber hängen fest in der Luft. :/

für jede coole Antwort bedanke ich mich schon mal :)

PS: die Widgets neu zu erzeugen wäre erstmal keine Lösung, da sie an anderer Stelle genutzt werden und ich daran nichts ändern kann ( Error - kein Zugriff ;P )
Hulk2442
Beiträge: 115
Registriert: 10. Januar 2007 13:44

Re: Widgets aus GridLayout rauspopeln

Beitrag von Hulk2442 »

Interessante Frage
Wenn du ein und das selbe Widget unterschiedlich handhaben willst musst einerseits auf diese unabhängig zugreifen können sowie es auch nur ein einziges mal einbinden/zuweisen.
Dabei musst du es aus seiner Verschachtelung herausnehmen removeWidget und auch die Verknüpfung zu dieser Verschachtelung lösen setParent( 0 ).
Dieses im Nachhinein wieder einzufügen ist leichter da es bereits losgelöst ist und beim einfügen die Verknüpfungen für dich automatisch von den anderen QObjecten übernommen wird.


HH - ClickLabel = zum klicken // MainWidget = Hauptfenster

Code: Alles auswählen

#ifndef MAINWIDGET_HH
#define MAINWIDGET_HH

#include <QWidget>
#include <QLabel>
#include <QVBoxLayout>
#include <QMap>
#include <QString>
#include <QMouseEvent>


class ClickLabel : public QLabel
{
	Q_OBJECT

	public:
		ClickLabel( int INiID, QWidget *pParent = 0 ) :
			QLabel( pParent ),
			iID( INiID )
		{
			setText( "Label: " + QString::number(iID) );
			setMinimumSize( 80, 80 );
		}

	signals:
		void clickSignal( int iID );
		void closeSignal( int iID );

	protected:
		void mouseReleaseEvent( QMouseEvent *pEvent )
		{
			emit clickSignal( iID );
			QLabel::mouseReleaseEvent( pEvent );
		}
		void closeEvent( QCloseEvent *pEvent )
		{
			emit closeSignal( iID );
			QLabel::closeEvent( pEvent );
		}

	private:
		int iID;
};


class MainWidget : public QWidget
{
	Q_OBJECT

	public:
		MainWidget( QWidget *pParent = 0 );

	public slots:
		void clickSlot( int iID );
		void closeSlot( int iID );

	private:
		QVBoxLayout *pVMainLayout;
		QMap< int, ClickLabel* > labelMap;
};

#endif // MAINWIDGET_HH

CC

Code: Alles auswählen

#include "MainWidget.hh"

#include <QDebug>


//==============================================================================	construct
MainWidget::MainWidget(QWidget *parent) :
	QWidget(parent)
{
	pVMainLayout = new QVBoxLayout;

	for( int i(0); i<10; i++ )
	{
		ClickLabel *pClick = new ClickLabel( i, 0 );
		connect( pClick, SIGNAL(clickSignal(int)), this, SLOT(clickSlot(int)) );
		connect( pClick, SIGNAL(closeSignal(int)), this, SLOT(closeSlot(int)) );
		labelMap.insert( i, pClick );
		pVMainLayout->addWidget( pClick );
	}

	this->setLayout( pVMainLayout );
}


//==============================================================================	click Slot
void MainWidget::clickSlot( int iID )
{
	ClickLabel *pLabel = labelMap.value( iID, NULL );
	if( NULL != pLabel )
	{
		pVMainLayout->removeWidget( pLabel );
		pLabel->setParent( 0 );
		pLabel->show();
	}
	else
	{} // do nothing //
}

//==============================================================================	close Slot
void MainWidget::closeSlot( int iID )
{
	ClickLabel *pLabel = labelMap.value( iID, NULL );
	if( NULL != pLabel )
	{
		pVMainLayout->insertWidget( iID, pLabel );
	}
	else
	{} // do nothing //
}

adziu24
Beiträge: 7
Registriert: 3. November 2013 10:40

Re: Widgets aus GridLayout rauspopeln

Beitrag von adziu24 »

Danke für deine Mühe, hat wunderbar geklappt!
Antworten