相关疑难解决方法(0)

如何通过QSignalMapper或其他方式将QString从QMenu传递到Qt槽

我有一个有许多子菜单的QMenu.这些是动态创建的,即名称菜单来自db并在循环中创建.现在我想在单击菜单时触发相同的插槽trigger()或类似,但我需要将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;
}
Run Code Online (Sandbox Code Playgroud)

或者,我也尝试过QSignalMapper,其中signalMapper是在构造函数中初始化的数据成员

signalMapper = new QSignalMapper(this);
Run Code Online (Sandbox Code Playgroud)

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)));
}
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,我没有得到任何错误,但是没有调用插槽函数playChannel.如果有人能帮助解决问题,我将非常感激.

更新1:我从其他示例中看到的唯一区别是,通常人们将 …

c++ qstring qt4 qmenu qt-signals

6
推荐指数
1
解决办法
3570
查看次数

标签 统计

c++ ×1

qmenu ×1

qstring ×1

qt-signals ×1

qt4 ×1