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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вызов слота  (Прочитано 3589 раз)
onlik
Гость
« : Февраль 05, 2009, 01:16 »

Здравствуйте!

Встречаю такие конструкции QTimer::singleShot(0, this, SLOT(Slot()))
Почему нельза просто вызвать Slot() ?
« Последнее редактирование: Февраль 05, 2009, 01:37 от onlik » Записан
Dendy
Гость
« Ответ #1 : Февраль 05, 2009, 01:22 »

Такая конструкция перенесёт вызов слота на следующую итерацию цикла событий. Полезно если хочется обьединить несколько вызовов метода в один.
Записан
onlik
Гость
« Ответ #2 : Февраль 05, 2009, 01:37 »

Спасибо!
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


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

Такая конструкция перенесёт вызов слота на следующую итерацию цикла событий. Полезно если хочется обьединить несколько вызовов метода в один.

Такой способ не объединит несколько вызовов в один, т.к. для каждого будет существовать свой таймер. Нужно использовать один и тот же таймер, что так получилось:

Код:
timer = new QTimer(this);
connect(timer, ...);
timer->setInterval(...);

timer->start();
timer->start();
timer->start();
Записан
ритт
Гость
« Ответ #4 : Февраль 05, 2009, 18:51 »

речь идёт о чём-то вроде
Код:
update();
QTimer::singleShot(0, this, SLOT(update()));
и singleShot - это единичный вызов, а не цикличный.

также весьма полезно использовать такой вызов для слотов с проверками. например:

Код:
bool SomeClass::isEnabled() const
{
    return m_enabled;
}

void SomeClass::setEnabled(bool b = true)
{
    if(m_enabled == b)
        return;

    m_enabled = b;
    //длительная операция обновления
}

Код:
bool b = isEnabled(); // `b` сейчас установлен true
setEnabled(true); // ничего не произойдёт, т.к. `m_enabled == b`

но нам нужно чтобы выполнилась `длительная операция обновления`
Код:
bool b = isEnabled(); // `b` сейчас установлен true (или в false - нам уже необязательно это знать)
QTimer::singleShot(0, this, SLOT(setEnabled()));
setEnabled(false);

ну, вот примрено так )
Записан
Dendy
Гость
« Ответ #5 : Февраль 05, 2009, 18:52 »

Цитировать
Такой способ не объединит несколько вызовов в один

Всё верно, слот будет вызван на следующей итерации столько раз сколько было вызовов QTimer::singleShot(). Обычно этот самый слот содержит проверку на оптимизации, чтобы не вызывать один и тот же код несколько раз.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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