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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Буфер сообщений с фиксированным кол-вом сообщ и их анимация  (Прочитано 12215 раз)
strilya
Гость
« : Август 09, 2015, 14:44 »

Доброго времени суток.
Есть задача. Реализовать появление различных сообщений на определенном участке гуя.
Сообщений в сумме не может быть больше N. Если это число превышено и нужно добавить новое сообщение, соотв самое старое удаляется, в конец списка добавляется новое.
Кроме того все это должно быть анимировано. Т.е. появление N-го сообщения должно быть плавным (изменение его прозрачности с 0 до 1), а также с позиции N+1 на N.
Формально, вроде бы, не сложно, за исключением некоторых вещей.

Как пробовал реализовывать я:
Есть ф-ция показа нового сообщения f(QString text).
Каждое сообщение - отдельный QLabel. Анимация и все такое QPropertyAnimation и QGraphicsOpacityEffect. Вся проблема в задержке анимации, из-за которой приходится использовать QTimer.
Т.е., если должно появиться новое сообщение, а в буфере уже максимум сообщений, то мы должны каждое сообщение сдвинуть вверх, причем самое первое должно быть удалено с уменьшением прозрачности. Если удалить его сразу, анимации не будет, разумеется. Поэтому следует ждать отработки анимации. (Реализовано следующим образом: В классе есть переменная _need_delete, которой присваивается адрес удаляемого сообщения, и дальше, отработанный singleshot вызывает слот удаления сообщения, адрес которого берет с _need_delete).
Работает при одном условии. Что ф-ция f не будет вызываться чаще, чем время ее работы.
Если f вызывается, к примеру, 3-4 раза за секунду, (animation duration = 500мсек), то начинается содомия.
Пробовал в f поставить QTimer, который вызывал бы слот, в котором все и делается. Но тут возникает проблема с аргументами. Аргумент текста, который нужно отобразить, в слот, который вызывается при timeout() QTimer`а, не передашь. Выход - переменная класса. Но опять же, если ф-ция f будет вызвана 3-4 раза в сек, то в переменной класса будет сохранено только последнее значение. И, соотв, будет показано 3-4 одинаковых сообщения.

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

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Август 10, 2015, 14:42 »

сходу напрашивается использорвание очереди QQueue. Добавляете в начало очереди, проверяете размер, если больше N удаляете с конца. Возможно нужно по таймеру (например раз в секунду) проверять, добавились ли новые сообщения, если да, то сразу удаляем лишние за один присест.
Записан
strilya
Гость
« Ответ #2 : Август 20, 2015, 17:38 »

сходу напрашивается использорвание очереди QQueue. Добавляете в начало очереди, проверяете размер, если больше N удаляете с конца. Возможно нужно по таймеру (например раз в секунду) проверять, добавились ли новые сообщения, если да, то сразу удаляем лишние за один присест.

Благодарю за помощь. Непременно изучу.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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