Qt4 需要取消映射信号映射器吗?

Qt4 需要取消映射信号映射器吗?,qt4,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), SIGN

我的一段代码:

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 )));
signalMapper=新的QSignalMapper(此);
for(int i=0;iaddWidget(pushb.at(row*opregel+c)、row、col);
连接(按钮位于(i)、信号(点击()、信号映射器、插槽(映射());
信号映射器->设置映射(在(i)和(i)处推送);
if(++col==opregel)
{
++行;
col=0;
}
if((行*opregel+col)==totalbuttons)
打破
}
连接(信号映射器,信号(映射(int)),此,插槽(goto_选项卡(int));
创建了一个按钮列表,并将其放置在gridlayout中。 放置在小部件中并放入qtabwidget的

嗯。 现在,这段代码被多次执行。我的tabwidget变为空,并且首先删除该选项卡上的小部件,因此我的按钮也将被删除。但是映射器会发生什么情况?这些按钮不再存在。之后,将为新的按钮创建一个新的映射器。 旧的怎么了?它还在那里,什么也没做吗? 我是否也应该删除信号映射器(如何删除?)


我是qt新手,有时它会让我困惑qt删除了什么以及我应该删除什么。

当您在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)));
}
class MappedWidget:公共QWidget
{
...
信号:
无效按钮已锁定(int i);
私人:
QList按钮;
QSignalMapper*映射器;
}
MappedWidget::MappedWidget(QWidget*父项):
QWidget(父级)
{
映射器=新的QSignalMapper(此);
...
//在这里进行映射
...
连接(映射器,信号(映射(int)),此,信号(按钮单击(int));
}

稍后您可以连接到此小部件的
按钮clicked(int)
信号。删除此小部件时,其所有子部件(包括映射器)也将被删除。

Hank,谢谢您的回复!我必须先消化一下:-)。我现在的做法与你的解决方案有很大不同吗?现在我将所有映射的按钮放在一个小部件中,并将其放在qtabwidget中。当我删除该小部件时,是否使用映射器删除按钮?当然,在移除标签之前,我必须手动删除我的小部件。我想理解它,但我需要时间。当你把你的按钮放在一个小部件上时,当这个小部件被删除时,它们会被自动删除。