Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Magvaj от Февраль 18, 2009, 12:59



Название: Реализация анимированных смайлов.
Отправлено: Magvaj от Февраль 18, 2009, 12:59
Доброго времени суток.
Хотелось бы узнать: кто-нибудь сабж реализовывал? Я уже всё перерыл. Хотелось бы сделать по типу MDC клиента или Skype.
Стандартными виджетами такое вроде не сделать... читал что нужна переделка, но вразумительной документации так и не нашёл :-(


Название: Re: Реализация анимированных смайлов.
Отправлено: BRE от Февраль 18, 2009, 13:01
Доброго времени суток.
Хотелось бы узнать: кто-нибудь сабж реализовывал? Я уже всё перерыл. Хотелось бы сделать по типу MDC клиента или Skype.
Стандартными виджетами такое вроде не сделать... читал что нужна переделка, но вразумительной документации так и не нашёл :-(
А если по таймеру картинки перерисовывать?


Название: Re: Реализация анимированных смайлов.
Отправлено: pastor от Февраль 18, 2009, 13:16
Несовсем понятен вопрос. Подгрузи gif картинки и все.


Название: Re: Реализация анимированных смайлов.
Отправлено: Magvaj от Февраль 18, 2009, 13:27
gif подгружен... проблема в том, что в клиентах надо по-нормальному их выделять в поле ввода.. копировать в виде текста... может и по таймету надо перерисовывать, только вот как реализовать нормальное взаиможействие с копированием и вводом текста?


Название: Re: Реализация анимированных смайлов.
Отправлено: Lion от Февраль 18, 2009, 23:51
http://wiki.qtcentre.org/index.php?title=Animation_in_QTextEdit тут глянь


Название: Re: Реализация анимированных смайлов.
Отправлено: pastor от Февраль 19, 2009, 14:27
Magvaj, можешь поинтересоваться этим вопросом у форумчанина IMPOMEZIA. Он разрабатывает свой клиент-серверный чат (http://www.prog.org.ru/topic_8414_0.html), думаю поддержка смайлов в нем есть.


Название: Re: Реализация анимированных смайлов.
Отправлено: IMPOMEZIA от Февраль 19, 2009, 17:25
http://wiki.qtcentre.org/index.php?title=Animation_in_QTextEdit тут глянь
Работать будет, но нужно сильно дорабатывать, что уменьшить максимальную скорость обновления и отключать анимацию для невидимых смайлов, но главная проблема как уменьшить размер перерисовки остался нерешённым, приходится обновлять блок целиком, а для больших блоков это огромные тормоза, в оригинальной статье документ перерисовывается целиком, что приводит к ещё большим тормозам, там же на странице обсуждения есть ссылка на таску 175893 (http://trolltech.com/developer/task-tracker/index_html?method=entry&id=175893), которая могла бы решить проблему, но её видимо не закроют никогда.

Сейчас использую QWebView, но там тоже есть некоторые проблемы с производительносью 243940 (http://www.qtsoftware.com/developer/task-tracker/index_html?method=entry&id=243940).

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

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


Название: Re: Реализация анимированных смайлов.
Отправлено: ритт от Февраль 19, 2009, 17:50
175893
приоритет 2 - т.е. будет реализовано в 4.6 или 4.7 (если не потребуется изменение интерфейса - тогда только 5.0)


Название: Re: Реализация анимированных смайлов.
Отправлено: Magvaj от Март 01, 2009, 16:51
да, скудно... но делать придётся...

всех благодарю за разъяснения ;-)


Название: Re: Реализация анимированных смайлов.
Отправлено: Magvaj от Март 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());
        }
}

При этом рисуется всё красиво, но есть недостаток, хотя не существенный- одинаковые смайлы двигаются синхронно ;-)


Название: Re: Реализация анимированных смайлов.
Отправлено: Magvaj от Март 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 и выводим туда, куда его надо скопировать ;-)

Если что- могу дать полный код функций ;-)


Название: Re: Реализация анимированных смайлов.
Отправлено: IMPOMEZIA от Март 11, 2009, 00:15
смайлы реализовал. Использовал код отсюда: http://wiki.qtcentre.org/index.php?title=Animation_in_QTextEdit
Разве оно не начёт тормозить, если текста станет много? из-за суррогатного обновления всего документа:
Код
C++ (Qt)
setLineWrapColumnOrWidth(lineWrapColumnOrWidth()); // causes reload


Название: Re: Реализация анимированных смайлов.
Отправлено: Magvaj от Март 11, 2009, 17:34
общался полдня- вроде всё нормально было... смайлы то грузятся всего один раз...