我的一段代码:
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删除的内容以及我应该删除的内容。
答案 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)
信号。删除此窗口小部件时,其所有子窗口(包括映射器)也将被删除。