Cómo pasar una QString a una ranura Qt desde un QMenu a través de QSignalMapper o de otra manera

Tengo un QMenu con muchos submenús. Estos se crean dinámicamente, es decir, los menús de nombres provienen de una base de datos y se crean en un bucle. Ahora quería disparar la misma ranura activada () o similar cuando se hace clic en un menú, pero necesitaba que el nombre del menú QString se pasara a la ranura para poder realizar acciones específicas del menú. Yo he tratadoesta es decir, pasar una QAction * al evento disparado y utilizar setData pero obtengo el error de tiempo de ejecución.

objeto :: conectar: ​​No hay tal señal QAction :: disparada (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;
}

Alternativamente, también he probado QSignalMapper donde signalMapper es un miembro de datos inicializado en el constructor

signalMapper = new QSignalMapper(this);

y

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)));
}

En el segundo caso, no recibo ningún error, sin embargo, no se está llamando a la función de ranura playChannel. Realmente agradecería si alguien pudiera ayudar a resolverlo.

Actualización 1: La única diferencia que veo en otros ejemplos que he visto es que generalmente las personas sonConexión de señales de varios widgets a una sola ranura (decir diferentes botones). En mi caso me estoy conectando.Varios submenús (con nombres diferentes) a una sola ranura. ¿Debería esto hacer alguna diferencia?

Actualización 2: Funcionó después de la corrección sugerida en la solución.abajo para QSignalMapper. También el hecho de que estaba usando SubMenu como argumento para establecer el mapa, donde debería haberse usado como elemento MenuAction en su lugar. Pero ahora estoy activando el evento varias veces, es decir, tantas veces como haya entradas en el menú principal para la categoría del submenú seleccionado. Si el tipo de canal es inglés (menú principal) con cuatro entradas), HBO, películas estrella, etc. (submenú), y elijo HBO, el evento se dispara cuatro veces con la cadena HBO. Funciona bien si creo un asignador de señal separado para cada submenú. Pero esperaba que se usara un solo mapeador y estoy haciendo algo incorrectamente aquí. Algunos detalles más en los comentarios a la respuesta.

Respuestas a la pregunta(1)

Su respuesta a la pregunta