2013-02-08 56 views
0

一塊我的代碼:需要unmap signalmapper嗎?

signalMapper = new QSignalMapper(this); 
for(int i=0; i<result.count(); ++i) 
{ 
    drawpushb(result.at(i).ptr,pushb.at(i),ratio,0); // draw pic in pushb. 
    grid->addWidget(pushb.at(row*opregel+c),row,col); 
    connect(pushb.at(i), SIGNAL(clicked()), signalMapper, SLOT(map())); 
    signalMapper->setMapping(pushb.at(i), i); 

    if(++col==opregel) 
    { 
     ++row; 
     col=0; 
    } 

    if((row*opregel + col)==totalbuttons) 
     break; 
} 

connect(signalMapper, SIGNAL(mapped(int)),this, SLOT(goto_tab(int))); 

有創建按鈕的列表,它們被放置在GridLayout。 這是放置在一個小部件,並將其放入qtabwidget。

好的。 現在這段代碼被執行多次。我的tabwidget被清空,首先在該選項卡上的小部件被刪除,所以我的按鈕也會被刪除。但是映射器會發生什麼?這些按鈕不再存在。之後,將爲新按鈕創建一個新的映射器。 舊的會發生什麼?它仍然在那裏,什麼都不做? 我是否應該刪除信號映射器(如何?)。

我是新來的QT,它有時會讓我困惑,什麼被QT刪除,我應該刪除自己。

回答

0

當你刪除Qt中的QObject時,它的所有子項都會自動刪除。因此,這將是一個好主意,使你的信號變換器您刪除控件的子:

class MappedWidget : public QWidget 
{ 
    ... 
signals: 
    void buttonClicked(int i); 

private: 
    QList<QPushButton*> buttons; 
    QSignalMapper *mapper; 
} 

MappedWidget::MappedWidget(QWidget *parent) : 
    QWidget(parent) 
{ 
    mapper = new QSignalMapper(this); 
    ... 
    // do mapping here 
    ... 

    connect(mapper, SIGNAL(mapped(int)), this, SIGNAL(buttonClicked(int))); 
} 

以後可以連接到這個小部件的buttonClicked(int)信號。當這個小部件被刪除時,其所有的孩子,包括一個映射器,也將被刪除。

+0

漢克,謝謝你的回覆!我必須首先消化:-)。我現在做的方式與您的解決方案有很大的不同嗎?現在我將所有映射的按鈕放在一個小部件中,並放入qtabwidget中。當我刪除那個小部件時,這些按鈕是不是用mapper刪除的?我希望在刪除標籤之前手動刪除我的小部件。我喜歡理解,但我需要時間。 –

+0

將按鈕放在小部件上時,它們將在刪除小部件時自動刪除。 – hank