Russian Qt Forum

Qt => Общие вопросы => Тема начата: onlik от Февраль 05, 2009, 01:16



Название: Вызов слота
Отправлено: onlik от Февраль 05, 2009, 01:16
Здравствуйте!

Встречаю такие конструкции QTimer::singleShot(0, this, SLOT(Slot()))
Почему нельза просто вызвать Slot() ?


Название: Re: Вызов слота
Отправлено: Dendy от Февраль 05, 2009, 01:22
Такая конструкция перенесёт вызов слота на следующую итерацию цикла событий. Полезно если хочется обьединить несколько вызовов метода в один.


Название: Re: Вызов слота
Отправлено: onlik от Февраль 05, 2009, 01:37
Спасибо!


Название: Re: Вызов слота
Отправлено: Alex Custov от Февраль 05, 2009, 14:47
Такая конструкция перенесёт вызов слота на следующую итерацию цикла событий. Полезно если хочется обьединить несколько вызовов метода в один.

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

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

timer->start();
timer->start();
timer->start();


Название: Re: Вызов слота
Отправлено: ритт от Февраль 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);

ну, вот примрено так )


Название: Re: Вызов слота
Отправлено: Dendy от Февраль 05, 2009, 18:52
Цитировать
Такой способ не объединит несколько вызовов в один

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