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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Очередность событий  (Прочитано 12182 раз)
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #15 : Апрель 14, 2015, 16:50 »

А, понял.

Дык это нормально, что нельзя вклиниться так просто между первой и второй прорисовкой, имхо.
Что если между перерисовками воткнуть QCoreApplication::processEvents? Далее отслеживаем, был ли клик/тык, а там уже отменяем текущую перерисовку и начинаем всё заново.
Быть может это поможет...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Апрель 14, 2015, 17:49 »

Дык это нормально, что нельзя вклиниться так просто между первой и второй прорисовкой, имхо.
ИМХО нет - почему более важное событие (нажатие мыши) следует после менее важного (перерисовки). Да, запрос на перерисовку (update) был послан раньше, но ведь его приоритет ниже

Что если между перерисовками воткнуть QCoreApplication::processEvents? Далее отслеживаем, был ли клик/тык, а там уже отменяем текущую перерисовку и начинаем всё заново.
А как "воткнуть между" - ведь рисование это обработчик события, просить в нем еще события = верный ппц
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #17 : Апрель 14, 2015, 18:02 »

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

Я вижу себе что-то вроде такого:

Код
C++ (Qt)
void fullUpdate()
{
   for (int i = 0; i < 4; ++i)
   {
       QCoreApplication::processEvents();       // тут у нас отмечается флаг активности пользователя / срабатывает мышь
       if (userEvent)
            break;
       window[i].upd();
   }
}

Цикл перерисовок прерывается, таймер видит, что у вас активен флаг userEvent, обнуляет его и запускает fullUpdate.
« Последнее редактирование: Апрель 14, 2015, 18:03 от __Heaven__ » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Апрель 15, 2015, 05:46 »

Почему вы считаете нажатие мыши более приоритетным событием, чем запрос перерисовки?
Ну как бы "впитал с молоком матери"  Улыбающийся

Я понимаю, что они обрабатываются в одном потоке и пока не завершится один процесс - другой не сможет вмешаться.
Давайте терминов придерживаться. Процесс - это тот у которого свое адресное пр-во.

Так, ну с таймером все-таки получается. Вместо того чтобы сразу делать update всем окнам их надо сохранить в списке. Событие таймера извлекает указатель на окно из списка и делает ему update. А событие мыши заполняет список.

Ну как-то я не в восторге. Конечно update растыкан в сотнях мест, не вижу как его глобально переопределить. И update вызывается еще и контролами Qt - тоже надо учитывать. Попробую сначала сделать пример, там посмотрим
Записан
AlexEx
Чайник
*
Offline Offline

Сообщений: 76


Просмотр профиля
« Ответ #19 : Апрель 15, 2015, 12:52 »

Конечно, MouseButtonPress нет, ибо GUI-шный поток один и занят в это время Paint'ом. Похоже, надо дробить Paint на части (если возможно). Аналогично тому, как иногда картинки прорисовывают - сперва одни группы точек по всей площади картинки, затем другие группы и т.д.
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #20 : Апрель 15, 2015, 13:22 »

0. флаг необходимости перерисовки сброшен
1. поступило событие что надо перерисовать - если флаг установлен то выход; иначе ставим флаг и таймер на 20 мсек singleshot и выход
3. таймер cработал - перерисовка, сброс флага
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #21 : Апрель 15, 2015, 14:38 »

Конечно, MouseButtonPress нет, ибо GUI-шный поток один и занят в это время Paint'ом.
Так и следующее событие - тоже paint (теперь уже другого окна), а хотелось бы сначала press

Похоже, надо дробить Paint на части (если возможно).
С OpenGL нет

0. флаг необходимости перерисовки сброшен
1. поступило событие что надо перерисовать - если флаг установлен то выход; иначе ставим флаг и таймер на 20 мсек singleshot и выход
3. таймер cработал - перерисовка, сброс флага
А как Вы будете рисовать в событии таймера?
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #22 : Апрель 15, 2015, 15:34 »

> А как Вы будете рисовать в событии таймера?

вот взял и рисовал на QGraphicsScene по таймеру как и описал
а для OpenGL нельзя по событию таймера рисовать ?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #23 : Апрель 15, 2015, 16:18 »

> А как Вы будете рисовать в событии таймера?

вот взял и рисовал на QGraphicsScene по таймеру как и описал
а для OpenGL нельзя по событию таймера рисовать ?
Там мутность великая Улыбающийся Надо устанавливать контекст, причем просто makeCurrent (как сделал бы нормальный человек) не катит. И контекст не будет создан до первого рисования.

А вообще в букваре пишут что низзя, рисуйте только из paintEvent! И для обычных виджетов так и есть, не создается painter вне paintEvent. И для обычных просто так не пропустить событие рисования (отдаваясь в таймер) т.к. background уже зачищен и экран обновится "при любой погоде"
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #24 : Апрель 15, 2015, 16:56 »

А вообще в букваре пишут что низзя, рисуйте только из paintEvent!

мое рисование было - это добавление на сцену элементов сцены (additem, прямоугольники, текст, заливка) - поэтому их можно в таймере

но не проблема и в paintEvent:
0. флаги "МожноРисовать" и "НужноРисовать"  сброшены
1. поступило событие что надо перерисовать - если флаг "НужноРисовать"  установлен то выход; иначе ставим флаг "НужноРисовать"  и таймер на 20 мсек singleshot и выход
3. таймер cработал - "МожноРисовать" устанавливаем
4. в paintEvent смотрим "МожноРисовать" , если не установлен - выход. если установлен - рисуем и сбрасываем оба флага (мутексы по месту ставим)
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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