Как передать QString в слот Qt из QMenu через QSignalMapper или иным образом
У меня есть QMenu со многими подменю. Они создаются динамически, то есть меню имен поступают из БД и создаются в цикле. Теперь я хотел запустить тот же слот triggered () или аналогичный при щелчке меню, но мне нужно было передать имя меню QString в слот, чтобы я мог выполнять действия, специфичные для меню. я пыталсяэто то есть передача QAction * к инициированному событию и использование setData, но я получаю ошибку во время выполнения.
object :: connect: нет такого сигнала QAction :: triggered (QAction *)
for(int j=0; j<channelTypes[i].getNumChannels() ; j++){
QAction *subMenuAct = subMenu->addAction(tr(c_name)); // c_name the menu name
subMenuAct->setData(ch_name);
connect(subMenuAct, SIGNAL(triggered(QAction *)), this, SLOT(playChannel(QAction *))); // playChannel is the slot
}
void <ClassName>::playChannel(QAction *channelAction)
{
QString str = channelAction->data().toString();
qDebug() << "Selected - " << str;
}
Кроме того, я также попытался QSignalMapper, где signalMapper является членом данных, инициализированных в конструкторе
signalMapper = new QSignalMapper(this);
а также
for(int j=0; j<channelTypes[i].getNumChannels() ; j++){
QAction *subMenuAct = subMenu->addAction(tr(c_name));
connect(subMenuAct, SIGNAL(triggered()), signalMapper, SLOT(map()));
signalMapper->setMapping(subMenu, ch_name);
connect(signalMapper, SIGNAL(mapped(QString)), this, SLOT(playChannel(QString)));
}
Во втором случае я не получаю никакой ошибки, однако функция слота playChannel не вызывается. Был бы очень признателен, если бы кто-то мог помочь решить это.
Обновление 1: Единственное отличие, которое я вижу из других примеров, которые я видел, состоит в том, что обычно людиподключение сигналов от нескольких виджетов к одному слоту (скажем разные кнопки). В моем случае я подключаюсьнесколько подменю (с разными именами) в одном слоте, Должно ли это иметь какое-то значение?
Обновление 2: Сработало после исправления, предложенного в решенииниже для QSignalMapper. Также тот факт, что я использовал SubMenu в качестве аргумента для setMapping, где вместо этого должен был использоваться элемент MenuAction. Но теперь я получаю событие несколько раз, то есть столько раз, сколько есть записей в главном меню для выбранной категории подменю. Если тип канала английский (главное меню) с четырьмя записями), HBO, звездные фильмы и т. Д. (Подменю), и я выбираю HBO, то событие запускается четыре раза со строкой HBO. Это работает нормально, если я создаю отдельный преобразователь сигнала для каждого подменю. Но я надеялся, что должен использоваться один картограф, и я делаю что-то здесь неправильно. Еще несколько подробностей в комментариях к ответу.