Russian Qt Forum

Qt => Общие вопросы => Тема начата: Evgeniya от Август 06, 2009, 15:07



Название: как определить был ли подключен сигнал к слоту
Отправлено: Evgeniya от Август 06, 2009, 15:07
доброго времени суток!!!
мне нужно определить был ли подключен сигнал к слоту или нет...Просто мне нужно, чтобы в определенном месте программы сигнал не испускался, но он к этому времени может быть и не подключен еще...А прменение disconnect к неподключенному сигналу наверное не желательно


Название: Re: как определить был ли подключен сигнал к слоту
Отправлено: MoPDoBoPoT от Август 06, 2009, 16:31
Как определить был ли подключен сигнал к слоту мне не известно, но, по-моему, нет ничего страшного в применении disconnect к неподключеному сигнал-слотовому соединению. Метод disconnect просто вернет false.


Название: Re: как определить был ли подключен сигнал к слоту
Отправлено: max1983 от Август 07, 2009, 01:30
Как определить был ли подключен сигнал к слоту мне не известно, но, по-моему, нет ничего страшного в применении disconnect к неподключеному сигнал-слотовому соединению. Метод disconnect просто вернет false.

суть проверки  в том и заключается что не знаешь подключён или нет, а проверить надо не отключая, вдруг соединены разные потоки.
И становится страшно...
а при "проверке" отключая и потом опять подключая могут быть сбои.  :'(


Название: Re: как определить был ли подключен сигнал к слоту
Отправлено: pastor от Август 07, 2009, 09:27
Можно на время выполнения какой-либо операции просто блокировать сигналы. См. QObject::blockSignals


Название: Re: как определить был ли подключен сигнал к слоту
Отправлено: SASA от Август 07, 2009, 19:02
Цитировать
мне нужно определить был ли подключен сигнал к слоту или нет...
Код:
void QObject::connectNotify ( const char * signal ) 
{
Булевскую переменную взвели
}
void QObject::disconnectNotify ( const char * signal )
{
Булевскую переменную сбросили
}
Цитировать
Просто мне нужно, чтобы в определенном месте программы сигнал не испускался, но он к этому времени может быть и не подключен еще...А прменение disconnect к неподключенному сигналу наверное не желательно
Смотри ответ pastor'а


Название: Re: как определить был ли подключен сигнал к слоту
Отправлено: pastor от Август 08, 2009, 11:04
А вот с етого момента по подробней..
Как ето поможет в определении соединены ли слот с сигналом?

А где я сказал что это поможет в определении соединения сигнал-слот? о_О Вот на что я ответил:


Просто мне нужно, чтобы в определенном месте программы сигнал не испускался


В по поводу проверки: Нельзя. Таких методов как isConnected(...), isDisconnected(...) в Qt нет.


Название: Re: как определить был ли подключен сигнал к слоту
Отправлено: Rcus от Август 08, 2009, 12:13
/** закрыл глаза */ Действительно нет...
/** открыл ассистант */
Цитировать
int QObject::receivers ( const char * signal ) const   [protected]
...
Warning: This function violates the object-oriented principle of modularity. However, it might be useful when you need to perform expensive initialization only if something is connected to a signal.
Уже есть :)


Название: Re: как определить был ли подключен сигнал к слоту
Отправлено: pastor от Август 08, 2009, 12:39
Да, я знаю есть такой метод. Но как он может помочь в случае, если мне нужно определить наличие коннекта между конкретным источником и конкретным приемником? + этот метод protected, что тоже не во всех случаях удобно.


Название: Re: как определить был ли подключен сигнал к слоту
Отправлено: lit-uriy от Август 08, 2009, 15:32
есть такая тема на кросплатформе:  Есть ли метод, чтобы узнать соединен ли сигнал со слотом?, и если соединен то сколько раз? (http://www.forum.crossplatform.ru/index.php?showtopic=1720)

И там есть упоминание такого метода:
Код
C++ (Qt)
QMetaObject::indexOfSlot( "myslot()")


Название: Re: как определить был ли подключен сигнал к слоту
Отправлено: Evgeniya от Август 10, 2009, 09:31
Спасибо огромное за ответы!!!
А если все же использвать disconnect и сигнал не будет подключен к слоту, то к чему это может привести???или это все-таки ничего страшного, как написал MoPDoBoPoT???


Название: Re: как определить был ли подключен сигнал к слоту
Отправлено: ритт от Август 10, 2009, 10:34
тогда я бы всё-таки подстраховался таким образом:
Код:
bool wasConnected = disconnect(...);
//...
if(wasConnected)
    connect(...);


Название: Re: как определить был ли подключен сигнал к слоту
Отправлено: Evgeniya от Август 10, 2009, 10:54
есть такая тема на кросплатформе:  Есть ли метод, чтобы узнать соединен ли сигнал со слотом?, и если соединен то сколько раз? (http://www.forum.crossplatform.ru/index.php?showtopic=1720)

И там есть упоминание такого метода:
Код
C++ (Qt)
QMetaObject::indexOfSlot( "myslot()")

А этот метод ищет именно подключенный слот??просто он у меня никогда не возвращает -1...


Название: Re: как определить был ли подключен сигнал к слоту
Отправлено: ритт от Август 10, 2009, 10:58
нет, данный метод возвращает индекс мета-метода в таблице мета-методов, что может быть использовано для некоторых оптимизаций, и к тебе совершенно не относится :)
а возвращает "-1" потому, что (наверняка) указываешь неверную сигнатуру...


Название: Re: как определить был ли подключен сигнал к слоту
Отправлено: Alex Custov от Август 10, 2009, 19:20
а возвращает "-1" потому, что (наверняка) указываешь неверную сигнатуру...

он не возвращает "-1" ;)


Название: Re: как определить был ли подключен сигнал к слоту
Отправлено: ритт от Август 10, 2009, 20:32
лол...по-ходу, сплю :)
если даже с неверной сигнатурой не возвращает -1, то всё плохо...