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に配置されます。

Ok。これで、そのコードが複数回実行されます。タブウィジェットが空になり、最初にそのタブにあるウィジェットが削除されるため、プッシュボタンも削除されます。しかし、マッパーはどうなりますか?それらのボタンはもう存在しません。その後、新しいプッシュボタン用に新しいマッパーが作成されます。古いものはどうなりますか?それはまだそこにあり、何もしていませんか?シグナルマッパーも削除する必要があります(方法は?)。

私はqtを初めて使用しますが、QTによって何が削除され、何を自分で削除する必要があるのか​​がわからないことがあります。

4

1 に答える 1

0

Qtでaを削除する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)後で、このウィジェットのシグナルに接続できます。このウィジェットが削除されると、マッパーを含むすべての子も削除されます。

于 2013-02-08T06:23:12.827 に答える