Russian Qt Forum

Qt => Вопросы новичков => Тема начата: YvenTitan от Февраль 17, 2017, 11:42



Название: Наследование сигналов
Отправлено: YvenTitan от Февраль 17, 2017, 11:42
Здравствуйте
Можете подсказать, при наследовании классов наследуются ли сигналы? Если наследуются, то можно ли сделать так, чтобы сигнал не наследовался (что-то типа protected члена)? Если можно, то как? Просто поместить в protected?


Название: Re: Наследование сигналов
Отправлено: Пантер от Февраль 17, 2017, 11:56
Сигналы наследуются. Нет смысла в protected сигналах.


Название: Re: Наследование сигналов
Отправлено: gil9red от Февраль 17, 2017, 11:58
А зачем вообще использовать protected для сигналов?


Название: Re: Наследование сигналов
Отправлено: YvenTitan от Февраль 17, 2017, 12:10
Я хочу, чтобы в наследуемом классе не было сигнала базового класса. Можно так сделать?


Название: Re: Наследование сигналов
Отправлено: Пантер от Февраль 17, 2017, 12:11
На солько я знаю, нет. Да и зачем???


Название: Re: Наследование сигналов
Отправлено: GreatSnake от Февраль 17, 2017, 12:17
А зачем вообще использовать protected для сигналов?
До Qt5 только такие и были.


Название: Re: Наследование сигналов
Отправлено: YvenTitan от Февраль 17, 2017, 12:27
Спасибо.
У меня получается, что из предка с помощью сигнала надо вызывать функцию наследника
У меня как раз QT4


Название: Re: Наследование сигналов
Отправлено: Пантер от Февраль 17, 2017, 12:31
Эм. А зачем вызывать сигналом, а не просто вызовом метода или тем же invokeMethod?


Название: Re: Наследование сигналов
Отправлено: ViTech от Февраль 17, 2017, 12:38
Я хочу, чтобы в наследуемом классе не было сигнала базового класса. Можно так сделать?

Лучше напишите, что в конечном итоге хотите получить. И чем наследование сигналов мешает.


Название: Re: Наследование сигналов
Отправлено: ssoft от Февраль 17, 2017, 13:04
Я хочу, чтобы в наследуемом классе не было сигнала базового класса. Можно так сделать?

Можно, например, так

Код:
class BlaBla
{
    Q_OBJECT

#define temp_signals signals
#undef signals
#define signals private

signals:
    void myPrivateSignal();

#undef signals
#define signals temp_signals

}

Можно поискать в недрах Qt, там довольно часто используются приватные сигналы. Но это недокументированные возможности.

Только в Qt вся инкапсуляция нарушена напрочь, любой сигнал можно дернуть через invokeMethod.


Название: Re: Наследование сигналов
Отправлено: ssoft от Февраль 17, 2017, 13:19
Вот так сами Qt шники делают

Код:
Q_SIGNALS:
#if !defined(Q_MOC_RUN) && !defined(qdoc)
    private: // can only be emitted by ...
#endif
  void somePrivateSignal();


Название: Re: Наследование сигналов
Отправлено: YvenTitan от Февраль 17, 2017, 13:28
Еще раз спасибо)
Вообще есть окно; от этого окна наследуется несколько окон, сколько именно неизвестно. Надо из первого окна посылать сигналы в наследуемые.


Название: Re: Наследование сигналов
Отправлено: Пантер от Февраль 17, 2017, 13:33
Для этого не сигналы нужны, а виртуальные слоты.


Название: Re: Наследование сигналов
Отправлено: YvenTitan от Февраль 17, 2017, 14:53
Я имел в виду в какое-то конкретно наследуемое.
Это фактически другой вопрос, на который я бы хотел получить ответ.

Есть окно(предок), в него приходят данные. В зависимости от того, какие данные, надо часть этих данных передать какому-то конкретному окну.
Тк я не знаю сколько окон (это количество определяет пользователь в процессе работы программы), то и не знаю сколько сигналов прописывать в классе.
Например, в предок пришла цифра 1 - значит окно номер 1 должно вывести 1, пришла 2 - окно номер 2 должно вывести 2 и тд
С помощью чего это реализовать?
Можно посылать один сигнал на все окна и окна будут сами понимать им пришло сообщение или нет. Т.е. если пришла цифра 2 в окно номер 1, то окно проверив 1 поймет, что сообщение пришло не ему


Название: Re: Наследование сигналов
Отправлено: Пантер от Февраль 17, 2017, 15:17
Можно всем посылать. Можно заюзать паттерн Наблюдатель.


Название: Re: Наследование сигналов
Отправлено: sergek от Февраль 17, 2017, 15:48
Можно посылать один сигнал на все окна и окна будут сами понимать им пришло сообщение или нет. Т.е. если пришла цифра 2 в окно номер 1, то окно проверив 1 поймет, что сообщение пришло не ему
Ну да, всем. Сигнал с параметром. В слоте в зависимости от значения параметра делаете все что нужно.