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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Какие критерии превращения метода в слот? + еще 2 вопроса  (Прочитано 16560 раз)
AAXEE
Гость
« : Февраль 13, 2009, 00:43 »

1. Вот в качестве примера:
Код:
  
   void cellChange(   const int row , const int col , const bool value ) ;  // Изменяет значение выбранной ячейки на value
   void cellExchange( const int row , const int col ) ;       // Меняет значение ячейки на противоположенное
   void cellClear(    const int row , const int col ) ;       // Устанавливает значение ячейки на false
   void cellFill(     const int row , const int col ) ;       // Устанавливает значение ячейки на true
Нужно ли из этих паблик методов делать слоты? Или сделать слотом лучше только cellChange?
Понятно, что можно и вообще не делать слотов(или делать только те, что нужны именно в данном проекте). И только при  надобности либо изменять существующий класс, либо наследоваться.
Но все же как решить нужен слот или нет?
Я смотрел в Assistantе QWidget. Некоторые методы не понятно по какому принципу попали в слоты и наоборот-некоторые методы почему-то не попали. Опять же, чем руководствовались разработчики?

2. Почти тот же вопрос и по сигналам. Когда нужно делать сигнал?

3. Некоторые слоты возвращают значение. Я правильно понимаю, что в концепции сигнал-слот это значение роли не играет и никак не может быть использовано? Оно используется только если данный метод-слот вызывать чисто как метод?

Спасибо за внимание!
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Февраль 13, 2009, 03:09 »

1 и 2 зависит от того что ты планируешь делать с классом дальше, если он слишком уникален для проекта, то делай так как удобно в данном проекте.

3 да, да.
Записан

Юра.
AAXEE
Гость
« Ответ #2 : Февраль 13, 2009, 10:12 »

Спасибо.
По первым двум пунктам: Так вот, что же делать если я класс планирую использовать дальше?
Хотя бы на моем примере покажите, что следовало бы сделать слотом и почему?
А класс я сделал Grid(с прорисовкой на виджете).  Grid может пригодиться везде, поэтому его дальнейшее использование может быть любым( игра Life, монохромное рисование...).
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #3 : Февраль 13, 2009, 10:30 »

Все слотами сделай Улыбающийся и будет счастье!
Записан

ArchLinux x86_64 / Win10 64 bit
AAXEE
Гость
« Ответ #4 : Февраль 13, 2009, 10:57 »

Пока так и сделал. Но неужели придется всегда почти все методы слотами делать?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #5 : Февраль 13, 2009, 11:57 »

А впринципе какая разница? Это же никаких расходов не несет, а добавляет "+ " в то что метод можно будет с сигналом связать! (ИМХО) Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
ритт
Гость
« Ответ #6 : Февраль 13, 2009, 12:04 »

1. слоты удобны там, где их можно соединить с актуальным сигналом (например, triggered -> setEnabled, close -> quit). если в обозримом окружении не наблюдается сигнала с параметрами "const int, const int, const bool [, ...]", то cellChange делать слотом мало смысла. (кстати, const int в параметрах - шибко перестрахованно...на мой взгляд); либо там, где предполагается какая-то польза от асинхронного вызова (например, update)

2. по сигналам почти наоборот - если имеется хоть один слот, которому было бы удобно подключиться оповещение об определённом событии, при котором эмитится данный сигнал; либо там, где предполагается какая-то польза от асинхронного вызова (например, valueChanged); либо в том случае, когда это способствует упрощению наследования от данного класса.

по п.п.1-2 общий совет - использовать по возможности простые или шаренные типы параметров и не использовать параметры со значением по умолчанию, если это всего лишь "может кому-нибудь пригодиться".

3. нет.
при синхронном вызове (либо асинхронном с ожиданием (что почти одно и то же)) можно получить результат работы метода так же, как и для вызова обычной функции, но через метаобъектную систему.
Юрий, опять "ай-ай-ай" Улыбающийся
не знал, что можно написать
Код
C++ (Qt)
int iResult = emit obj->pleaseStartSomethingAndReturnStatusCode();
 
? Улыбающийся
Записан
AAXEE
Гость
« Ответ #7 : Февраль 13, 2009, 12:29 »

2kuzulis
Даже если так, остается вопрос с Сигналами. Их придется дополнительно дописывать. Расход времени, если на то пошло. Хотя, я не уверен что слоты выполняются так же быстро как и методы.
2Константин
Спасибо. Стало понятней, хотя написано немного запутанно=)
Цитировать
кстати, const int в параметрах - шибко перестрахованно...на мой взгляд
Зато по сигнатуре сразу видно, что параметр внутри не меняется. Хотя, он и так не изменится. Но все равно, зачем-то же ввели такую возможность в язык.
Цитировать
и не использовать параметры со значением по умолчанию
Насколько я знаю в слотах нельзя использовать параметры по умолчанию.
Цитировать
3. нет.
при синхронном вызове (либо асинхронном с ожиданием (что почти одно и то же)) можно получить результат работы метода так же, как и для вызова обычной функции, но через метаобъектную систему.
Честно говоря, я этого не понял. Есть ощущение, что это из разряда извращений, и простым смертным такое не нужно в подавляющем числе задач.
Записан
Rcus
Гость
« Ответ #8 : Февраль 13, 2009, 12:36 »

3. нет.
при синхронном вызове (либо асинхронном с ожиданием (что почти одно и то же)) можно получить результат работы метода так же, как и для вызова обычной функции, но через метаобъектную систему.
Юрий, опять "ай-ай-ай" Улыбающийся
не знал, что можно написать
Код
C++ (Qt)
int iResult = emit obj->pleaseStartSomethingAndReturnStatusCode();
 
? Улыбающийся
qthelp://com.trolltech.qt.442/qdoc/signalsandslots.html
Цитировать
Signals are automatically generated by the moc and must not be implemented in the .cpp file. They can never have return types (i.e. use void).
./src/corelib/kernel/qobjectdefs.h
Цитировать
# define Q_SIGNALS protected
Записан
ритт
Гость
« Ответ #9 : Февраль 13, 2009, 12:43 »

> # define Q_SIGNALS protected
блин, так и думал, что кто-нибудь заметит Улыбающийся
просто нужно было показать, что это член класса, а расписывать было лениво...

3. да, это в некоторой степени можно расценивать как извращение. но иногда можно и воспользоваться извращением, если это облегчает жизнь Улыбающийся /* правда, сам я пока ещё не пользовался _этим_ "извращением" */

2. в слотах можно использовать параметры по умолчанию. просто тогда мок генерит по слоту на каждый такой параметр (неудачно выразился). в общем, сделай параметр по умолчанию и загляни в сгенерированный moc-файл - сразу всё станет понятно.
Записан
AAXEE
Гость
« Ответ #10 : Февраль 13, 2009, 12:51 »

Цитировать
2. в слотах можно использовать параметры по умолчанию. просто тогда мок генерит по слоту на каждый такой параметр (неудачно выразился). в общем, сделай параметр по умолчанию и загляни в сгенерированный moc-файл - сразу всё станет понятно.
Странно, но в книге Макса Шлее( страница 45 ) написано:
Цитировать
Правда, есть небольшие ограничения, отличающие обычные методы от слотов. В слотах нельзя использовать параметры по умолчанию, например slotMethod(int n = 0), и определять слоты как static.
Записан
BRE
Гость
« Ответ #11 : Февраль 13, 2009, 12:56 »

Странно, но в книге Макса Шлее( страница 45 ) написано:
Цитировать
Правда, есть небольшие ограничения, отличающие обычные методы от слотов. В слотах нельзя использовать параметры по умолчанию, например slotMethod(int n = 0), и определять слоты как static.
Сигнал:
Цитировать
void QAbstractButton::clicked ( bool checked = false )   [signal]

Слот:
Цитировать
void QAbstractButton::animateClick ( int msec = 100 )   [slot]
Записан
AAXEE
Гость
« Ответ #12 : Февраль 13, 2009, 13:04 »

Да, да, это я уже понял.
Просто я не верно поставил акцент
Странно, НО в книге Макса Шлее( страница 45 ) написано
->
Странно ТО, что в книге Макса Шлее( страница 45 ) написано
Вроде хорошая книжка, и такой косяк.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #13 : Февраль 13, 2009, 13:34 »

3. нет.
при синхронном вызове (либо асинхронном с ожиданием (что почти одно и то же)) можно получить результат работы метода так же, как и для вызова обычной функции, но через метаобъектную систему.
Юрий, опять "ай-ай-ай" Улыбающийся
не знал, что можно написать
Код
C++ (Qt)
int iResult = emit obj->pleaseStartSomethingAndReturnStatusCode();
 
? Улыбающийся
что-то примера я не понял. Получается, что когда выполнится связанный с сигналом "pleaseStartSomethingAndReturnStatusCode" слот, возвращающий значение, тогда в "iResult" поместится значение возвращенное слотом?
Записан

Юра.
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #14 : Февраль 13, 2009, 13:47 »

что-то примера я не понял. Получается, что когда выполнится связанный с сигналом "pleaseStartSomethingAndReturnStatusCode" слот, возвращающий значение, тогда в "iResult" поместится значение возвращенное слотом?

А нигде не написано что это сигнал Подмигивающий

Код
C++ (Qt)
#ifndef QT_NO_EMIT
# define emit
#endif
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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