Привет. Есть такая структура классов:
Код | class ActionManager { ... private: typedef QSharedPointer<Action> ActionPtr; QVector<ActionPtr> m_actions; .... }
class Action: public QObject { Q_OBJECT ... };
class ScaleLPMenuAction: public Action { public: ScaleLPMenuAction() { m_scaleMapper.reset(new QSignalMapper); connect(m_scaleMapper.data(), SIGNAL(mapped(int)), this, SLOT(performSubAction(int)));
/* некий for по созданию менюх */ { QAction *subMenuAction = subMenu->addAction(name); connect(subMenuAction, SIGNAL(triggered()), m_scaleMapper.data(), SLOT(map())); m_scaleMapper->setMapping(subMenuAction, id); } }
private: QScopedPointer<QSignalMapper> m_scaleMapper;
private slots: void performSubAction(int id); };
|
В вектор конкретный экземпляр добавляется как
Код | ActionPtr actionPtr(new ScaleLPMenuAction); m_actions.append(actionPtr);
|
При нажатии на пункт меню, связанный сигнал-слотами через QSignalMapper, я ожидаю вызов слота performSubAction(int id), однако получаю следующую ошибку:
Код | Object::connect: No such slot Action::performSubAction(int)
|
Ругается на эту строку:
Код | connect(m_scaleMapper.data(), SIGNAL(mapped(int)), this, SLOT(performSubAction(int)));
|
Однако, если слот performSubAction() добавить в базовый класс Action и сделать его виртуальным для переопределения в наследнике, то все работает. Почему так? |