Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: strilya от Август 09, 2015, 14:44



Название: Буфер сообщений с фиксированным кол-вом сообщ и их анимация
Отправлено: 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ти, и в каждой рано или поздно возникает одна из вышеописанных проблем.
Поглядывал в сторону массива адресов сообщений в классе, но как регулировать его переполнение и обработку этого переполнения (анимированную, не стоит забывать).


Название: Re: Буфер сообщений с фиксированным кол-вом сообщ и их анимация
Отправлено: Fregloin от Август 10, 2015, 14:42
сходу напрашивается использорвание очереди QQueue. Добавляете в начало очереди, проверяете размер, если больше N удаляете с конца. Возможно нужно по таймеру (например раз в секунду) проверять, добавились ли новые сообщения, если да, то сразу удаляем лишние за один присест.


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

Благодарю за помощь. Непременно изучу.