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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTime  (Прочитано 3425 раз)
vladislav4k
Гость
« : Июль 11, 2012, 23:47 »

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

Сообщений: 625


Просмотр профиля WWW
« Ответ #1 : Июль 12, 2012, 00:16 »

Код:
QTimer timer;
timer.serInterval(100);
QEventLoop loop;
connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit));
timer.start();
loop.exec();
-->Код смены картинки

Как-то так..Сам не тестил.Можно еще без QEventLoop, создать новый слот и по таймауту в нем менять картинку.
« Последнее редактирование: Июль 12, 2012, 00:18 от kibsoft » Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
Bepec
Гость
« Ответ #2 : Июль 12, 2012, 06:52 »

вставляй ради прикола qApp->processEvents.
У тебя форма не может обработать события - ты ей циклом не даёшь.

Как вариант - вместо постоянного цикла используй новый слот с таймером.
Если вообще всё плохо, можешь попробовать вставлять processEvents в каждой итерации цикла.
Записан
vladislav4k
Гость
« Ответ #3 : Июль 12, 2012, 10:11 »

вставляй ради прикола qApp->processEvents.
У тебя форма не может обработать события - ты ей циклом не даёшь.

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

Можно по подробней, а то тяжело понять)
Записан
Bepec
Гость
« Ответ #4 : Июль 12, 2012, 10:20 »

У каждого потока есть очередь событий.
Выглядит примерно так
Код:
отрисовка мышки
отрисовка экрана
изменение картинки
отрисовка экрана
нажатие клавиши
нажатие мышки
отрисовка экрана
цикл
изменение картинки
изменение картинки
изменение картинки
изменение картинки
изменение картинки
изменение картинки
изменение картинки

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

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

PS если использовать таймер(QTimer), то будет всё хоккей.
Записан
vladislav4k
Гость
« Ответ #5 : Июль 12, 2012, 11:48 »

У каждого потока есть очередь событий.
Выглядит примерно так
Код:
отрисовка мышки
отрисовка экрана
изменение картинки
отрисовка экрана
нажатие клавиши
нажатие мышки
отрисовка экрана
цикл
изменение картинки
изменение картинки
изменение картинки
изменение картинки
изменение картинки
изменение картинки
изменение картинки

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

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

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


Огромное спасибо! Очень помог, понял все, все работает!
Бывают добрые люди:)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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