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

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

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

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

Сообщений: 5876


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


Просмотр профиля 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

Сообщений: 5876


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


Просмотр профиля 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

Сообщений: 5876


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


Просмотр профиля 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.058 секунд. Запросов: 23.