So übergeben Sie einen QString von einem QMenu über QSignalMapper oder auf andere Weise an einen Qt-Steckplatz

Ich habe ein QMenu mit vielen Untermenüs. Diese werden dynamisch erstellt, d. H. Die Namensmenüs stammen aus einer Datenbank und werden in einer Schleife erstellt. Jetzt wollte ich den gleichen Slot auslösen, der ausgelöst wurde () oder ähnlich, wenn auf ein Menü geklickt wurde, aber ich musste den Namen des QString-Menüs an den Slot übergeben, damit ich menüspezifische Aktionen ausführen konnte. Ich habe versuchtdiese d.h. eine QAction * an das ausgelöste Ereignis übergeben und setData verwendet, aber ich erhalte den Laufzeitfehler.

object :: connect: Kein solches Signal QAction :: ausgelöst (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;
}

Alternativ habe ich auch QSignalMapper ausprobiert, wobei signalMapper ein im Konstruktor initialisiertes Datenelement ist

signalMapper = new QSignalMapper(this);

und

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

Im zweiten Fall bekomme ich keine Fehlermeldung, jedoch wird die Slot-Funktion playChannel nicht aufgerufen. Würde mich wirklich freuen, wenn jemand helfen könnte, es zu lösen.

Update 1: Der einzige Unterschied, den ich von anderen Beispielen sehe, ist, dass es normalerweise Menschen sindVerbinden von Signalen mehrerer Widgets mit einem einzigen Steckplatz (Sprich verschiedene Knöpfe). In meinem Fall verbinde ichmehrere Untermenüs (mit unterschiedlichen Namen) auf einen Steckplatz. Sollte dies einen Unterschied machen?

Update 2: Es funktionierte nach der in der Lösung vorgeschlagenen Korrekturunten für QSignalMapper. Auch die Tatsache, dass ich SubMenu als Argument für setMapping verwendet habe, wobei stattdessen als MenuAction-Element hätte verwendet werden sollen. Aber jetzt werde ich mehrmals ereignisgesteuert, d. H. So oft, wie Einträge im Hauptmenü für die ausgewählte Untermenükategorie vorhanden sind. Wenn der Kanaltyp Englisch (Hauptmenü) mit vier Einträgen), HBO, Star-Movies usw. (Untermenü) ist und ich HBO wähle, wird das Ereignis viermal mit der Zeichenfolge HBO ausgelöst. Es funktioniert gut, wenn ich für jedes Untermenü einen eigenen Signal-Mapper erstelle. Aber ich hatte gehofft, dass ein einzelner Mapper verwendet werden sollte und ich mache hier etwas falsch. Einige Details in den Kommentaren zur Antwort.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage