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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сигналы и область видимости  (Прочитано 5830 раз)
naf2000
Гость
« : Февраля 04, 2011, 12:39 »

А что в Qt сигналы могут быть только публичными? То есть кто угодно может подписаться на сигнал объекта?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5877


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


Просмотр профиля WWW
« Ответ #1 : Февраля 04, 2011, 12:44 »

А смысл в непубличном сигнале?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Robotex
Гость
« Ответ #2 : Февраля 04, 2011, 15:03 »

А можно свой сигнал создать?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5877


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


Просмотр профиля WWW
« Ответ #3 : Февраля 04, 2011, 15:06 »

В своем классе сколько хочешь. Улыбающийся
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Denjs
Гость
« Ответ #4 : Февраля 04, 2011, 15:36 »

А смысл в непубличном сигнале?
гм.... не задумывался пока вопрос не был задан.
т.е. "кто угодно может подписаться на сигнал объекта?" - это то верно, и правильно...
если в какой-то точке программы нам известны ссылка на 2 объекта - источник и приемник - то мы можем спокойно связать их через сигнал-слот,
даже если они "не видят друг друга" - главное что бы сигнатуры функций совпадали.
С этим все понятно.

Но давайте подумаем в другом направлении:

Сигналы реализуются в виде методов класса если не ошибаюсь... да?
а так-как они публичные, то получается, что "в принципе" "некто" может вызвать "принудительное испускание сигнала",
если он конечно знает ссылку на объект и метод "в который был реализован" описанный в секции "public signals" сигнал...
т.е. мы вызываем метод, и в итоге класс испускает сигнал...
в этом смысле мне действительно интереснее видет мои сигналы как "protected signals"... потому что сигналы, имхо, должен испускать обект только по собственной инициативе... так? не?

кто из опытных гуру может дать разъяснения по этому вопросу?
« Последнее редактирование: Февраля 04, 2011, 15:42 от Denjs » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5877


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


Просмотр профиля WWW
« Ответ #5 : Февраля 04, 2011, 15:42 »

Эм. Приведи пример как кто-то может вызвать твой сигнал.
Записан

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

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Февраля 04, 2011, 15:47 »

Цитата: Denjs
сигналы, имхо, должен испускать обект только по собственной инициативе... так? не?
Для чего вам нужны такие ограничения?


Цитата: Пантер
Эм. Приведи пример как кто-то может вызвать твой сигнал.
QMetaObject::invokeMethod()
Записан

Qt 5.11/4.8.7 (X11/Win)
Denjs
Гость
« Ответ #7 : Февраля 04, 2011, 16:09 »

Цитата: Denjs
сигналы, имхо, должен испускать обект только по собственной инициативе... так? не?
Для чего вам нужны такие ограничения?
потому что идеологически - задача сигналов - информирование внешнего мира об изменении состояния объекта)))

Но на самом деле все хорошо)
В ходе игрищЪ понял, что
метод определенный в секции signals - он попадает в секцию protected.
(собственно это и есть ответ на первую часть вопроса топик-стартера)

Виноват. Смел сомневаться в Троллях.  тут был не прав. Смеющийся

signalsender.h
Код:
class signalsender: public QObject
{
    Q_OBJECT

public:
    signalsender();
signals:
    void mysig();
};

main.cpp
Код:
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    signalsender *mySignalSender=new signalsender();
    QObject::connect(mySignalSender,SIGNAL(mysig()), &w,SLOT(mySigSenderRcv()));


    mySignalSender->mysig(); // <<------------- вот это не пройдет! )


    w.show();

    return a.exec();
}

при попытке сборки получаем отлуп :
Цитировать
..\signaltest\/signalsender.h: In function 'int qMain(int, char**)':
..\signaltest\/signalsender.h:12: error: 'void signalsender::mysig()' is protected
..\signaltest\main.cpp:14: error: within this context
Смеющийся

Для особых экспериментаторов - соответсвующий проект в приложении.

(хотя что будет если мы "зафрендим" 2 класса? они смогут испускать сигналы друг-за-дргуа? т.е. прямой вызов метода, реализующего сигнал - прокатит ?)
« Последнее редактирование: Февраля 04, 2011, 16:17 от Denjs » Записан
Waryable
Гость
« Ответ #8 : Февраля 04, 2011, 17:26 »

Если б вы могли извне приказать чужому классу дружить с вашим, тогда на первый взгляд проблем не было бы. Но это, к счастью, практически не возможно.
Записан
Akon
Гость
« Ответ #9 : Февраля 04, 2011, 22:11 »

Сигналы находятся в области protected (Q_SIGNALS расширяется в protected) по 2-м причинам:
- не допустить явного вызова Q_EMIT foo.fooSignal(...);
- сигналы должны быть доступными для классов-наследников.

Касательно 1-й причины - ничто не мешает приконнектить внешний сигнал к сигналу fooSignal(...) и вызвать его.
Записан
naf2000
Гость
« Ответ #10 : Февраля 07, 2011, 09:25 »

Чтобы из вне нельзя было повесить слот на сигнал или наоборот, удалить его
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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