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 //
}