在我的Qt應用程序中,我動態創建了一些小部件。其中包括需要具有類似行爲的QToolButton。Qt:動態小部件信號和插槽連接
這裏是如何的小部件創建:
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
編輯:基於山的答案,因爲我需要的實例名稱,而不是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...
}
你說得對。它避免做自己的習慣和比較。謝謝。 – Yosko