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