Qt: сигнал динамического виджета и соединение слотов
В моем приложении 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
EDIT: основанный наshanответ, и потому что мне нужно имя экземпляра вместо самого QToolButton, вот что я пришел к
void MyWindow::unselectInstance() {
foreach(QString instance, unselectButtonMap.keys()) {
if(unselectButtonMap[instance] == QObject::sender()) {
//do stuff here...
}
}
}
Сравнение указателей, кажется, работает довольно хорошо.
RE-EDIT: и на основе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...
}