crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> connect проблемы при наследовании
greh
  опции профиля:
сообщение 2.7.2012, 18:01
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 23.11.2009
Пользователь №: 1252

Спасибо сказали: 0 раз(а)




Репутация:   0  


При наследовании от класса, который уже наследует QObject возникает проблема регистрации (соединения) слотов дочернего класса:

QObject -> Parent -> Child

Данный код в конструкторе Child:
connect(anything, SIGNAL(destroyed()), this, SLOT(testSlot1()));

приводит к следуюшему сообщению:

QObject::connect: No such slot Parent::testSlot1() in ..\test\child.cpp:6

Т.е. при регистрации почему-то берётся базовый класс, а не текущий. Попытки приведения this к Child ни к чему не привели.

Parent.h:
Раскрывающийся текст
#ifndef PARENT_H
#define PARENT_H

#include <QObject>

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()));
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 2.7.2012, 18:08
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


а попробуй сделать слот виртуальным и объявить в базовом классе.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
greh
  опции профиля:
сообщение 2.7.2012, 18:36
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 23.11.2009
Пользователь №: 1252

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Trisch @ 2.7.2012, 20:08) *
а попробуй сделать слот виртуальным и объявить в базовом классе.


Тогда в реальном приложении весь смысл абстракции теряется (QObject -> Player -> PhononPlayer). В последнем идёт работа уже с конкретными объектами Phonon, которые испускают специфические сигналы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 3.7.2012, 15:36
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


А ты слот определил? А то я в коде чет это не заметил(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
greh
  опции профиля:
сообщение 3.7.2012, 16:22
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 23.11.2009
Пользователь №: 1252

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Trisch @ 3.7.2012, 17:36) *
А ты слот определил? А то я в коде чет это не заметил(

Разницы нет, результат один (да, пробовал с определённым).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
greh
  опции профиля:
сообщение 3.7.2012, 17:24
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 23.11.2009
Пользователь №: 1252

Спасибо сказали: 0 раз(а)




Репутация:   0  


Вообщем на windows системах, а может и на всех, есть такой баг, который лечится только ручной чисткой папки с банарниками и make файлами или её удалением (очистка в креаторе не помогает).
Побробнее написано тут(последнее сообщение).

На случай смерти ссылки:
Раскрывающийся текст
Цитата
Такое часто встречается вот в каком случае:

— создаешь хедер и срр, пишешь класс
— добавляешь в проект
— прогоняешь qmake
— потом добавляешь в класс слоты/сигналы

В этом случае при запуске qmake'а в п.3 не создаются вызовы moc'а, т.к. не было нужно. После добавления сигналов/слотов нужны вызовы moc'а для генерации стабов. Вот их и не хватает для vtable'а.
Простой повторный запуск qmake'а не спасает, надо удалить файлы object_script.XXX.debug и object_script.XXX.release.

P.S. Это на винде, на других платформах может быть немного иначе, но идея думаю понятна.

Ну и к тому же в Chid.h таки нужен макрос Q_OBJECT
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.1.2023, 5:01