Как передать 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*.