Как передать QString в слот Qt из QMenu через QSignalMapper или иначе
у меня есть QMenu со многими подменю. Они динамически создаются, т. е. меню имен поступают из БД и создаются в цикле. Теперь я хотел запустить тот же слот triggered () или аналогичный при нажатии на меню, но мне нужно было передать имя меню QString в слот, чтобы я мог выполнять определенные действия меню. Я пробовал этой т. е. передача QAction * в вызванное событие и используемые setData, но я получаю ошибку времени выполнения.
1 ответов
после добавления QAction
в меню, вам нужно только подключить QMenu
в слот. Вы не подключаете каждое действие индивидуально к слоту:
for(int j=0; j<channelTypes[i].getNumChannels() ; j++){
ch_name = <name from the database for the channel j>;
QAction *subMenuAct = subMenu->addAction(tr(ch_name));
subMenuAct->setData(ch_name);
}
connect(subMenu, SIGNAL(triggered(QAction *)),
this, SLOT(playChannel(QAction *)), Qt::UniqueConnection);
как я не знаю, как вы, если вы удалите subMenu
каждый раз, когда динамическое меню заполнены,Qt::UniqueConnection
убедитесь, что слот не быть повторно несколько раз.
Для версии Signal mapper вы должны только подключить действия к mapper в цикле. Подключение от mapper к слоту нужно сделать только один раз.
for(int j=0; j<channelTypes[i].getNumChannels() ; j++){
ch_name = <name from the database for the channel j>;
QAction *subMenuAct = subMenu->addAction(tr(ch_name));
connect(subMenuAct, SIGNAL(triggered()), signalMapper, SLOT(map()));
signalMapper->setMapping(subMenuAct, ch_name);
}
connect(signalMapper, SIGNAL(mapped(QString)), this, SLOT(playChannel(QString)));
и для этого случая слот playChannel
принять QString
вместо QAction*
.