0

我的一段代码:

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 )));

有一个按钮列表被创建,它们被放置在一个网格布局中。它被放置在一个小部件中,并被放入一个 qtabwidget。

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

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

4

1 回答 1

0

当您QObject在 Qt 中删除 a 时,它的所有子级都会自动删除。因此,最好让您的信号映射器成为您删除的小部件的子级:

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)到此小部件的信号。当这个小部件被删除时,它的所有孩子,包括一个映射器,也将被删除。

于 2013-02-08T06:23:12.827 回答