Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] Не находит слот.


Автор: spyswamp 8.2.2013, 08:13
Привет. Есть такая структура классов:

Код

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 и сделать его виртуальным для переопределения в наследнике, то все работает.
Почему так?

Автор: borisbn 8.2.2013, 09:26
В ScaleLPMenuAction добавь макрос Q_OBJECT. Он нужен для moc'а для создания метакласса ScaleLPMenuAction

Автор: spyswamp 8.2.2013, 14:37
Да, действительно, Q_OBJECT не указан. Все остальные слоты pure virtual, поэтому макрос и не указал, видимо, для наследника.
Спасибо. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)