QObject::connect проблемы при наследовании
При наследовании от класса, который уже наследует QObject возникает проблема регистрации (соединения) слотов дочернего класса:
QObject -> Parent -> Child
Данный код в конструкторе Child:
приводит к следуюшему сообщению:
QObject::connect: No such slot Parent::testSlot1() in ..testchild.cpp:6
Т.е. при регистрации почему-то берётся базовый класс, а не текущий. Попытки приведения this к Child ни к чему не привели.
Parent.h:
Parent.cpp:
Child.h:
Child.cpp:
QObject -> Parent -> Child
Данный код в конструкторе Child:
connect(anything, SIGNAL(destroyed()), this, SLOT(testSlot1()));
приводит к следуюшему сообщению:
QObject::connect: No such slot Parent::testSlot1() in ..testchild.cpp:6
Т.е. при регистрации почему-то берётся базовый класс, а не текущий. Попытки приведения this к Child ни к чему не привели.
Parent.h:
#ifndef PARENT_H
#define PARENT_H
#include
class Parent : public QObject
{
Q_OBJECT
public:
explicit Parent(QObject *parent = 0);
};
#endif // PARENT_H
Parent.cpp:
#include "parent.h"
Parent::Parent(QObject *parent) :
QObject(parent)
{
}
Child.h:
#ifndef CHILD_H
#define CHILD_H
#include "parent.h"
class Child : public Parent
{
public:
Child();
public slots:
void testSlot1();
};
#endif // CHILD_H
Child.cpp:
#include "child.h"
Child::Child()
{
QObject* anything = new QObject();
connect(anything, SIGNAL(destroyed()), this, SLOT(testSlot1()));
}
void Child::testSlot1()
{
}
1 ответов
Вообщем на windows системах, а может и на всех, есть такой баг, который лечится только ручной чисткой папки с банарниками и make файлами или её удалением (очистка в креаторе не помогает).
Побробнее написано тут http://www.rsdn.ru/forum/cpp.qt/3731259.all.aspx
(последнее сообщение).
На случай смерти ссылки:
Такое часто встречается вот в каком случае:
— создаешь хедер и срр, пишешь класс
— добавляешь в проект
— прогоняешь qmake
— потом добавляешь в класс слоты/сигналы
В этом случае при запуске qmake'а в п.3 не создаются вызовы moc'а, т.к. не было нужно. После добавления сигналов/слотов нужны вызовы moc'а для генерации стабов. Вот их и не хватает для vtable'а.
Простой повторный запуск qmake'а не спасает, надо удалить файлы object_script.XXX.debug и object_script.XXX.release.
P.S. Это на винде, на других платформах может быть немного иначе, но идея думаю понятна.
Ну и к тому же в Chid.h таки нужен макрос Q_OBJECT