无法识别signalmap错误的来源

时间:2011-06-16 19:33:02

标签: debugging qt visual-c++ signals

我有以下代码:

QSignalMapper* signalMapper = new QSignalMapper (this) ;

ttAct = new QAction(tr("Ttime"), this);
ttAct->setCheckable(true);
ttAct->setChecked(true);
connect(ttAct, SIGNAL(triggered()), signalMapper, SLOT( map() ));

plAct = new QAction(tr("Length"), this);
plAct->setCheckable(true);
plAct->setChecked(true);
connect(plAct, SIGNAL(triggered()), signalMapper, SLOT( map() ));

signalMapper->setMapping(ttAct,     0);
signalMapper->setMapping(plAct,     1);


connect (signalMapper, SIGNAL( mapped(int) ), this, SLOT(enableM(int))) ;

其中enableM是

void MainWindow::enableM(int i){
    qDebug() << i;
}

是一个私人广告位,只是打印。 代码编译得很好,但是当我尝试运行它时,它会失败。

据我所知,从qDebug语句来看,它就失败了

mMenu->addAction(ttAct);

(mMenu - &gt; addAction(plAct);之后是下一行)

关于我缺少的任何想法?

非常感谢。

/ * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * * /

/ * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * * /

/ * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * * /

编辑: 如果您在Qt,Main Windows中打开示例代码 - &gt;菜单,并添加以下代码,你应该得到相同的情况:

到mainwindow.h: 添加

void enableM(int);

到私人广告位

添加

QMenu *metricMenu;
QAction *ttAct;
QAction *plAct;

私人。

在mainwindow.cpp中,添加

#include <QSignalMapper>

在顶部,然后添加

QSignalMapper* signalMapper = new QSignalMapper (this) ;

ttAct = new QAction(tr("Ttime"), this);
ttAct->setCheckable(true);
ttAct->setChecked(true);
connect(ttAct, SIGNAL(triggered()), signalMapper, SLOT( map() ));

plAct = new QAction(tr("Length"), this);
plAct->setCheckable(true);
plAct->setChecked(true);
connect(plAct, SIGNAL(triggered()), signalMapper, SLOT( map() ));


signalMapper->setMapping(ttAct,     0);
signalMapper->setMapping(plAct,     1);

connect (signalMapper, SIGNAL( mapped(int) ), this, SLOT(enableM(int))) ;

到createActions()方法。

添加以下

fileMenu = menuBar()->addMenu(tr("&Metrics"));
metricMenu->addAction(ttAct);
metricMenu->addAction(plAct);

到createMenus()方法。

最后在任何地方添加以下功能

void MainWindow::enableM(int i){
    infoLabel->setText(tr("I'm alive! " + i));
}

那么你应该得到同样的错误。

2 个答案:

答案 0 :(得分:0)

制作一些断点并在调试模式下运行。 bug显示自己

答案 1 :(得分:0)

好吧,设法找到答案:

fileMenu = menuBar()->addMenu(tr("&Metrics"));
metricMenu->addAction(ttAct);
metricMenu->addAction(plAct);

几乎是正确的。应该是

metricMenu = menuBar()->addMenu(tr("&Metrics"));
metricMenu->addAction(ttAct);
metricMenu->addAction(plAct);

代替。