Russian Qt Forum

Qt => Общие вопросы => Тема начата: vladislav4k от Июль 11, 2012, 23:47



Название: QTime
Отправлено: vladislav4k от Июль 11, 2012, 23:47
Уже 100500 тема от меня.
Вопрос: при нажатии на кнопку вызывается функция, в начале которой создается лейбл(с картинкой) и выводится в виджет, естественно все работает. После показа лебла добавляю:
QTime time;
    time.start();
    for (int i = 0; i < 10; ) {
        if (time.elapsed() > 40) {
            time.start();
            ++i;
        }
    }
После чего в лейбл вывожу другую картинку.
Но при запуске, приложение крутит цикл с таймером, и только потом выводит картинки. Почему?
Мне нужно что б вывелась одна, и через некоторое время вторая. (как анимация)
Как это реализовать?


Название: Re: QTime
Отправлено: kibsoft от Июль 12, 2012, 00:16
Код:
QTimer timer;
timer.serInterval(100);
QEventLoop loop;
connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit));
timer.start();
loop.exec();
-->Код смены картинки

Как-то так..Сам не тестил.Можно еще без QEventLoop, создать новый слот и по таймауту в нем менять картинку.


Название: Re: QTime
Отправлено: Bepec от Июль 12, 2012, 06:52
вставляй ради прикола qApp->processEvents.
У тебя форма не может обработать события - ты ей циклом не даёшь.

Как вариант - вместо постоянного цикла используй новый слот с таймером.
Если вообще всё плохо, можешь попробовать вставлять processEvents в каждой итерации цикла.


Название: Re: QTime
Отправлено: vladislav4k от Июль 12, 2012, 10:11
вставляй ради прикола qApp->processEvents.
У тебя форма не может обработать события - ты ей циклом не даёшь.

Как вариант - вместо постоянного цикла используй новый слот с таймером.
Если вообще всё плохо, можешь попробовать вставлять processEvents в каждой итерации цикла.
Да не пашет из за цикла.

Можно по подробней, а то тяжело понять)


Название: Re: QTime
Отправлено: Bepec от Июль 12, 2012, 10:20
У каждого потока есть очередь событий.
Выглядит примерно так
Код:
отрисовка мышки
отрисовка экрана
изменение картинки
отрисовка экрана
нажатие клавиши
нажатие мышки
отрисовка экрана
цикл
изменение картинки
изменение картинки
изменение картинки
изменение картинки
изменение картинки
изменение картинки
изменение картинки

Т.е. меняя картинку ты добавляешь это событие в конец очереди. А цикл у тебя всё продолжается и не даёт это событие исполнить. А уже как цикл отработает и твою программу отпустит, сразу происходят накопленные изменения картинки.

processEvents вызывает дальнейшую обработку событий, до конца накопленных. Т.е. при вызове будет обработаны все события из очереди, а после продолжится выполнение функции.

PS если использовать таймер(QTimer), то будет всё хоккей.


Название: Re: QTime
Отправлено: vladislav4k от Июль 12, 2012, 11:48
У каждого потока есть очередь событий.
Выглядит примерно так
Код:
отрисовка мышки
отрисовка экрана
изменение картинки
отрисовка экрана
нажатие клавиши
нажатие мышки
отрисовка экрана
цикл
изменение картинки
изменение картинки
изменение картинки
изменение картинки
изменение картинки
изменение картинки
изменение картинки

Т.е. меняя картинку ты добавляешь это событие в конец очереди. А цикл у тебя всё продолжается и не даёт это событие исполнить. А уже как цикл отработает и твою программу отпустит, сразу происходят накопленные изменения картинки.

processEvents вызывает дальнейшую обработку событий, до конца накопленных. Т.е. при вызове будет обработаны все события из очереди, а после продолжится выполнение функции.

PS если использовать таймер(QTimer), то будет всё хоккей.


Огромное спасибо! Очень помог, понял все, все работает!
Бывают добрые люди:)