QSignalMapper 和 QAction 的问题永远不会触发 Slot

Posted

技术标签:

【中文标题】QSignalMapper 和 QAction 的问题永远不会触发 Slot【英文标题】:Problem with QSignalMapper and QAction never triger the Slot 【发布时间】:2011-07-14 08:02:53 【问题描述】:

您好,我尝试将带有参数的插槽绑定到 QAction 触发的信号 我有这个代码,上下文菜单工作得很好。但 OpenPublishWin 从未触发。

void MyApp::ShowContextMenu(const QPoint& pos) // this is a slot

    QString groupID;
    QPoint globalPos = ui.treeView_mainwindow->mapToGlobal(pos);
    QModelIndex modelIndx = ui.treeView_mainwindow->indexAt(pos);
    groupID = modelIndx.model()->index(modelIndx.row(),0,modelIndx.parent()).data(Qt::UserRole).toString();
 QMenu myMenu;
  OpenPublishAction = new QAction(tr("Send"), this);
 myMenu.addAction(OpenPublishAction);

 connect(OpenPublishAction, SIGNAL(triggered()),m_SignalMapper, SLOT(map()) );
 m_SignalMapper->setMapping(OpenPublishAction,groupID);
 connect(m_SignalMapper, SIGNAL(mapped(QString)), this, SLOT(OpenPublishWin(QString)));

    QAction* selectedItem = myMenu.exec(globalPos);


void MyApp::OpenPublishWin(QString gid)

 WRITELOG(gid)

【问题讨论】:

【参考方案1】:

快速查看QSignalMapper 的 Qt 文档(假设这是您根据问题标题使用的内容)指出映射信号的参数是 const QString&。我不记得在这种情况下参数是否需要准确用于连接,但这可能是一个因素。

此外,通过将它们包装在断言或某种形式的验证中来仔细检查您的连接是否正在建立。如果无法建立连接,Qt 也会打印到控制台。

【讨论】:

永远不要在断言中包装连接!和更新的包装到断言任何代码做一些工作,只是检查。请改用验证。 如果您知道自己在做什么并且只是在调试断言应该没问题。但是我知道你的意思,因为我在本周调试了一些依赖于断言内部逻辑的东西。 好吧,assert 没问题,除非你忘记删除它))这迟早会发生...... 是的,知道我们在某些时候都是白痴,最好只使用验证而不使用断言来处理这类事情。说得对! 没有 Q_VERIFY 宏,但我为此编写了一个...#ifdef _DEBUG #define Q_VERIFY(x) Q_ASSERT(x) #else #define Q_VERIFY(x) (void)x #endif

以上是关于QSignalMapper 和 QAction 的问题永远不会触发 Slot的主要内容,如果未能解决你的问题,请参考以下文章

QtApplets-QSignalMapper使用

QSignalMapper类处理多信号关联同一个槽的方法

Qt:如何使用 QSignalMapper 为非标准按钮实现 QDialogBu​​ttonBox ?

使用 QSignalMapper

QT之QSignalMapper(可以理解为转发器,多个按钮绑定到一个Edit上,且能分辨。每个单独连接的话,反而麻烦)

python 使用QSignalMapper制作动态复选框/按钮/ MenuItems / Everything