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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Реализация анимированных смайлов.  (Прочитано 9522 раз)
Magvaj
Гость
« : Февраль 18, 2009, 12:59 »

Доброго времени суток.
Хотелось бы узнать: кто-нибудь сабж реализовывал? Я уже всё перерыл. Хотелось бы сделать по типу MDC клиента или Skype.
Стандартными виджетами такое вроде не сделать... читал что нужна переделка, но вразумительной документации так и не нашёл :-(
Записан
BRE
Гость
« Ответ #1 : Февраль 18, 2009, 13:01 »

Доброго времени суток.
Хотелось бы узнать: кто-нибудь сабж реализовывал? Я уже всё перерыл. Хотелось бы сделать по типу MDC клиента или Skype.
Стандартными виджетами такое вроде не сделать... читал что нужна переделка, но вразумительной документации так и не нашёл :-(
А если по таймеру картинки перерисовывать?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #2 : Февраль 18, 2009, 13:16 »

Несовсем понятен вопрос. Подгрузи gif картинки и все.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Magvaj
Гость
« Ответ #3 : Февраль 18, 2009, 13:27 »

gif подгружен... проблема в том, что в клиентах надо по-нормальному их выделять в поле ввода.. копировать в виде текста... может и по таймету надо перерисовывать, только вот как реализовать нормальное взаиможействие с копированием и вводом текста?
Записан
Lion
Гость
« Ответ #4 : Февраль 18, 2009, 23:51 »

http://wiki.qtcentre.org/index.php?title=Animation_in_QTextEdit тут глянь
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Февраль 19, 2009, 14:27 »

Magvaj, можешь поинтересоваться этим вопросом у форумчанина IMPOMEZIA. Он разрабатывает свой клиент-серверный чат, думаю поддержка смайлов в нем есть.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
IMPOMEZIA
Гость
« Ответ #6 : Февраль 19, 2009, 17:25 »

Работать будет, но нужно сильно дорабатывать, что уменьшить максимальную скорость обновления и отключать анимацию для невидимых смайлов, но главная проблема как уменьшить размер перерисовки остался нерешённым, приходится обновлять блок целиком, а для больших блоков это огромные тормоза, в оригинальной статье документ перерисовывается целиком, что приводит к ещё большим тормозам, там же на странице обсуждения есть ссылка на таску 175893, которая могла бы решить проблему, но её видимо не закроют никогда.

Сейчас использую QWebView, но там тоже есть некоторые проблемы с производительносью 243940.

Цитата: Magvaj
проблема в том, что в клиентах надо по-нормальному их выделять в поле ввода..
т.е. чтоб смайлы отображались в поле ввода? такое я не использую, но выбор не велик, см. выше.

Цитата: Magvaj
копировать в виде текста...
Да, очень нужная штука, но я пока не разбирался с этим.
Записан
ритт
Гость
« Ответ #7 : Февраль 19, 2009, 17:50 »

175893
приоритет 2 - т.е. будет реализовано в 4.6 или 4.7 (если не потребуется изменение интерфейса - тогда только 5.0)
Записан
Magvaj
Гость
« Ответ #8 : Март 01, 2009, 16:51 »

да, скудно... но делать придётся...

всех благодарю за разъяснения ;-)
Записан
Magvaj
Гость
« Ответ #9 : Март 10, 2009, 22:37 »

смайлы реализовал. Использовал код отсюда: http://wiki.qtcentre.org/index.php?title=Animation_in_QTextEdit

Единственное дополнение сделал- когда имеется несколько ресурсов с одинаковым урлом(например два одинаковых улыбающихся смайла- очень частая ситуация)- они перерисовываются с наложением, так как метод animate вызывается всё чаще с каждым добавлением ресурса.

Для этого в описании класса объявил:

Код:
QStringList AddedAnimations;

После функцию addAnimation привёл к виду:

Код:
void MyAnimatedTextEdit::addAnimation(const QUrl& url, const QString& fileName)
{
        if(!(AddedAnimations.contains(url.toString())))
        {
                QMovie* movie = new QMovie(this);
                movie->setFileName(fileName);
                urls.insert(movie, url);
                connect(movie, SIGNAL(frameChanged(int)), this, SLOT(animate()));
                movie->start();
                AddedAnimations.append(url.toString());
        }
}

При этом рисуется всё красиво, но есть недостаток, хотя не существенный- одинаковые смайлы двигаются синхронно ;-)
Записан
Magvaj
Гость
« Ответ #10 : Март 10, 2009, 22:50 »

Цитата: Magvaj
копировать в виде текста...
Да, очень нужная штука, но я пока не разбирался с этим.

Если интересно:
Допустим есть

Код:
MyAnimatedTextEdit *qw;

из описанного выше класса.
Через QTextCursor можно получить ссылку на выделенное с помощью

Код:
QTextDocumentFragment sl=qw->textCursor().selection();
QString sts=sl.toHtml();

Затем если строка sts не пуста- значит что-то выделено и можно приступать к экранированию. Собственно мне возвращалось из строки "123:-)123", где соответственно рожа в виде смайла, что-то вроде:

Код:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><!--StartFragment--><span style=" color:#000000;">123</span><img src="ad.gif" /><span style=" color:#000000;">123</span><!--EndFragment--></p></body></html>

Теперь ищем в документе все ссылки на смайлы и экранируем их в соответствии с таблицей имеющихся смайлов. В моём случае я менял все "<img src="FILENAME" />" на рожи.
После этого нехитрой манипуляцией с любым классом типа QTextDocument или QTextEdit преобразобываем экранированный HTML в PlainText и выводим туда, куда его надо скопировать ;-)

Если что- могу дать полный код функций ;-)
Записан
IMPOMEZIA
Гость
« Ответ #11 : Март 11, 2009, 00:15 »

смайлы реализовал. Использовал код отсюда: http://wiki.qtcentre.org/index.php?title=Animation_in_QTextEdit
Разве оно не начёт тормозить, если текста станет много? из-за суррогатного обновления всего документа:
Код
C++ (Qt)
setLineWrapColumnOrWidth(lineWrapColumnOrWidth()); // causes reload
Записан
Magvaj
Гость
« Ответ #12 : Март 11, 2009, 17:34 »

общался полдня- вроде всё нормально было... смайлы то грузятся всего один раз...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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