Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Алёна_4_12_1989 от Май 31, 2012, 10:14



Название: Signals and slots problem
Отправлено: Алёна_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)));


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



Название: Re: Signals and slots problem
Отправлено: Пантер от Май 31, 2012, 10:17
Больше кода покажи.


Название: Re: Signals and slots problem
Отправлено: Алёна_4_12_1989 от Май 31, 2012, 10:20
Чтобы больше кода, мне надо куски проекта копировать. Вы не могли бы мне объяснить как правильно использовать сигналы классов-родителей? Или здесь нет никаких особенностей?


Название: Re: Signals and slots problem
Отправлено: Пантер от Май 31, 2012, 10:22
Сигнал-то эммитишь?


Название: Re: Signals and slots problem
Отправлено: GreatSnake от Май 31, 2012, 10:34
Если mySlot() принадлежит MChild, то в MChild тоже нужно включать Q_OBJECT.


Название: Re: Signals and slots problem
Отправлено: Алёна_4_12_1989 от Май 31, 2012, 10:48
Большое спасибо за помощь. Я кажется поторопилась с вопросом. Оказалось, что я не тому объекту назначила сигнал в коннекте.


Название: Re: Signals and slots problem
Отправлено: sudo от Июнь 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. В приведённом куске сигналы эмиттиться не будут, пока там не будет макроса


Название: Re: Signals and slots problem
Отправлено: GreatSnake от Июнь 04, 2012, 10:33
Каждый класс, работающий через метаобъектную систему, обязан содержать макрос Q_OBJECT.
Ну почему же, есть исключения) Производный класс использующий слоты базового класса сей макрос иметь не обязан.


Название: Re: Signals and slots problem
Отправлено: sudo от Июнь 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