需要unmap signalmapper?

时间:2013-02-08 01:15:24

标签: qt4

我的一段代码:

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变为空,首先删除该选项卡上的小部件,因此我的按钮也将被删除。但是映射器会发生什么?这些按钮不再存在。之后,将为新按钮创建一个新的映射器。 旧的会发生什么?它还在那里,什么都不做? 我是否应该删除signalmapper(怎么做?)。

我是qt的新手,它有时会让我感到困惑的是QT删除的内容以及我应该删除的内容。

1 个答案:

答案 0 :(得分: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)信号。删除此窗口小部件时,其所有子窗口(包括映射器)也将被删除。