Не могу определить источник ошибки карты сигналов - PullRequest
0 голосов
/ 16 июня 2011

У меня есть следующий код:

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--> addAction (plAct); следующая строка после этого)

Есть идеи о том, что мне не хватает?

Большое спасибо.

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

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

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

Edit: Если вы откроете пример кода в Qt, Main Windows -> Menus и добавите следующий код, вы должны попасть в ту же ситуацию:

В mainwindow.h: add

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 голосов
/ 17 июня 2011

Ну, удалось найти ответ:

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

только почти правильно.Должно быть вместо

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

.

0 голосов
/ 16 июня 2011

сделать несколько точек останова и запустить в режиме отладки.ошибка показывает себя

...