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