私の 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...
}