У меня есть следующий код:
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));
}
, тогда вы получите ту же ошибку, что и я.