2

私の Qt アプリでは、いくつかのウィジェットを動的に作成しています。その中には、同様の動作が必要な QToolButtons があります。

ウィジェットの作成方法は次のとおりです。

QMap<QString, QToolButton*> unselectButtonMap;
foreach(QString instance, ...) {
  unselectButtonMap[instance] = new QToolButton;
  myLayout->addWidget(unselectButtonMap[instance]);
  QObject::connect(unselectButtonMap[instance],SIGNAL(clicked()),this,SLOT(unselectInstance()));
}

unselectInstenceここで、どのインスタンスが関係しているかをスロットに知らせたいと思います。

インスタンス名をパラメーターとしてスロットに与えることを最初に考えましたが、スロットはシグナルからのみパラメーターを取得します。アイデアは次のようなものでした:

QObject::connect(unselectButtonMap[instance],SIGNAL(clicked()),this,SLOT(unselectInstance(instance)));

それを行う方法について他のアイデアはありますか?

注:Qt4.8を使用しています

編集: shanの回答に基づいており、QToolButton 自体の代わりにインスタンス名が必要だったため、ここに私が思いついたものがあります

void MyWindow::unselectInstance() {
  foreach(QString instance, unselectButtonMap.keys()) {
    if(unselectButtonMap[instance] == QObject::sender()) {
      //do stuff here...
    }
  }
}

ポインタの比較はかなりうまくいくようです。

再編集: user1313312の回答に基づいて、 QSignalMapperを宣言します。

QSignalMapper *signalMapper = new QSignalMapper(this);
QObject::connect(signalMapper, SIGNAL(mapped(QString)), this, SLOT(unselectInstance(QString)));

次にQToolButtonをマッパーに接続します

signalMapper->setMapping(unselectButtonMap[instance], instance);
QObject::connect(unselectButtonMap[instance],SIGNAL(clicked()),signalMapper,SLOT(map()));

スロットははるかに単純になります。

void MyWindow::unselectinstance(QString instance) {
  //do stuff here...
}
4

2 に答える 2

2

QObject::sender()スロット内で使用して送信者を取得します。シグナルを発するオブジェクトを返します。お役に立てれば。

于 2012-08-29T08:00:17.500 に答える
2

使用QObject::sender()はまったく問題ありませんが、理想的なアプローチはQSignalMapper です

于 2012-08-29T08:35:25.880 に答える