Russian Qt Forum
Ноябрь 24, 2024, 23:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Signals and slots problem  (Прочитано 4342 раз)
Алёна_4_12_1989
Гость
« : Май 31, 2012, 10:14 »

Здравствуйте. У меня такая проблема. В базовом классе описан сигнал, который посылается (emit) в классе наследнике. Макрос Q_OBJECT размещен в базовом классе. Этот же базовый класс наследуется от QObject. Т.е. вот так:

class MBase : public QObject {
   signals:
      void mySignal(QString s);
}

class MChild : MBase {

}

в приложении:

MBase *myObj = new MChild();
connect (myObj, SIGNAL(mySignal(QString)), this, SLOT(mySlot(QString)));


В итоге в слот программа не заходит. В чем может быть причина?

Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Май 31, 2012, 10:17 »

Больше кода покажи.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Алёна_4_12_1989
Гость
« Ответ #2 : Май 31, 2012, 10:20 »

Чтобы больше кода, мне надо куски проекта копировать. Вы не могли бы мне объяснить как правильно использовать сигналы классов-родителей? Или здесь нет никаких особенностей?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Май 31, 2012, 10:22 »

Сигнал-то эммитишь?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Май 31, 2012, 10:34 »

Если mySlot() принадлежит MChild, то в MChild тоже нужно включать Q_OBJECT.
Записан

Qt 5.11/4.8.7 (X11/Win)
Алёна_4_12_1989
Гость
« Ответ #5 : Май 31, 2012, 10:48 »

Большое спасибо за помощь. Я кажется поторопилась с вопросом. Оказалось, что я не тому объекту назначила сигнал в коннекте.
Записан
sudo
Гость
« Ответ #6 : Июнь 04, 2012, 10:12 »


class MBase : public QObject {
   signals:
      void mySignal(QString s);
}

class MChild : MBase {

}

MBase *myObj = new MChild();
connect (myObj, SIGNAL(mySignal(QString)), this, SLOT(mySlot(QString)));



Каждый класс, работающий через метаобъектную систему, обязан содержать макрос Q_OBJECT. В приведённом куске сигналы эмиттиться не будут, пока там не будет макроса
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Июнь 04, 2012, 10:33 »

Каждый класс, работающий через метаобъектную систему, обязан содержать макрос Q_OBJECT.
Ну почему же, есть исключения) Производный класс использующий слоты базового класса сей макрос иметь не обязан.
Записан

Qt 5.11/4.8.7 (X11/Win)
sudo
Гость
« Ответ #8 : Июнь 04, 2012, 10:59 »

Каждый класс, работающий через метаобъектную систему, обязан содержать макрос Q_OBJECT.
Ну почему же, есть исключения) Производный класс использующий слоты базового класса сей макрос иметь не обязан.

Не будем путать топикстартера Подмигивающий А так, да, в документации и написано
Цитировать
The Q_OBJECT macro must appear in the private section of a class definition that declares its own signals and slots or that uses other services provided by Qt's meta-object system.

Имхо, стоит указывать в любом случае при наследовании от QObject. И в качестве хорошего тона, и в качестве явного указания на принадлежность объекта к QObject
« Последнее редактирование: Июнь 04, 2012, 11:00 от sudo » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.045 секунд. Запросов: 23.