Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: andrew.k от Декабрь 20, 2011, 21:22



Название: строка ввода для чата
Отправлено: andrew.k от Декабрь 20, 2011, 21:22
Строка - это QTextEdit.
В нее можно добавлять смайлы.
Добавляются смайл это строчка вида *smile*.
При добавлении в строку ввода заменяется на html вида <img src="smiles/smile.gif"/>
Дальше перед отправкой хочу получить из текстедита строку вида "some text *smile*", чтобы не пересылать лишний html и по другим причинам.
Брать html и делать replace это как-то совсем быдлокодерство по-моему.

Думаю это как-то возможно поработав с QTextEdit и QTextDocument, но не пойму как.

need assistance!


Название: Re: строка ввода для чата
Отправлено: andrew.k от Декабрь 20, 2011, 23:00
Если делать toPlainText получается строка вида "some text \177774" это подтверждает мое предположение насчет QTextDocument. Копаю дальше.

Пробовал добавять html <img src="smile.gif" alt="*smile*"> но в результирующем html его нет. Видимо после добавления он убирается.


Название: Re: строка ввода для чата
Отправлено: Пантер от Декабрь 20, 2011, 23:51
Где-то когда-то тут пробегала темка по данному поводу. QTextEdit не полностью держит хтмл.


Название: Re: строка ввода для чата
Отправлено: andrew.k от Декабрь 21, 2011, 00:35
Использование alt было лишь попыткой, сам по себе он мне не нужен.
Вот первые шаги. Осталось доделать и причесать код.
Код
C++ (Qt)
   QTextDocument *doc = ui->textEdit->document();
   QTextBlock block = doc->begin();
   forever
   {
       if(!block.isValid())
           break;
       QString t;
       for (QTextBlock::iterator it = block.begin(); !(it.atEnd()); ++it)
       {
           QTextFragment fragment = it.fragment();
           if (fragment.isValid())
           {
               QTextImageFormat image = fragment.charFormat().toImageFormat();
               if(image.isValid())
               {
                   t += "*" + image.name() + "*";
               }
               else
                   t += fragment.text();
           }
       }
       block = block.next();
   }
В данном коде image.name() будет возвращать значение src из добавленного ранее тега <img>.

Видимо для полной красивости нужно будет писать свой хендлер, но пока что сойдет и так. Это уже что-то.

Советы по-прежнему приветствуются.


Название: Re: строка ввода для чата
Отправлено: andrew.k от Декабрь 21, 2011, 01:38
QChar::ObjectReplacementCharacter   0xfffc   Used to represent an object such as an image when such objects cannot be presented.

Как раз то самое значение \177774


Название: Re: строка ввода для чата
Отправлено: Kolobok от Декабрь 21, 2011, 12:58
А если две одинаковые картинки подряд будут, что получится?


Название: Re: строка ввода для чата
Отправлено: andrew.k от Декабрь 21, 2011, 13:47
А если две одинаковые картинки подряд будут, что получится?
А какая разница?


Название: Re: строка ввода для чата
Отправлено: Kolobok от Декабрь 21, 2011, 14:47
Попробуй, увидишь. Потом нам расскажешь ;)


Название: Re: строка ввода для чата
Отправлено: andrew.k от Декабрь 21, 2011, 15:17
Попробуй, увидишь. Потом нам расскажешь ;)
Получится две одинаковые картинки подряд.


Название: Re: строка ввода для чата
Отправлено: Kolobok от Декабрь 21, 2011, 23:57
Нет, что будет находиться в t после твоего кода?


Название: Re: строка ввода для чата
Отправлено: andrew.k от Декабрь 22, 2011, 00:21
Нет, что будет находиться в t после твоего кода?
Я не понимаю тебя. Ты на что-нибудь намекаешь? Или что-то не понимаешь сам. Скажи прямо.
В t будет "some text *smile**smile*" - два смайла подряд.

Две идущих подряд одинаковые картинки ни чем не отличаются от двух разных и любых других комбинаций.
Поясни.


Название: Re: строка ввода для чата
Отправлено: Kolobok от Декабрь 22, 2011, 03:10
А если так:
Код:
QTextDocument doc;
QTextCursor cursor(&doc);
cursor.insertImage(":/image.png");
cursor.insertImage(":/image.png");


Название: Re: строка ввода для чата
Отправлено: andrew.k от Декабрь 22, 2011, 12:32
А если так:
Код:
QTextDocument doc;
QTextCursor cursor(&doc);
cursor.insertImage(":/image.png");
cursor.insertImage(":/image.png");
Я не понимаю тебя. Ты на что-нибудь намекаешь? Или что-то не понимаешь сам. Скажи прямо.
В t будет ":/image.png:/image.png" - два смайла подряд.

Две идущих подряд одинаковые картинки ни чем не отличаются от двух разных и любых других комбинаций.
Поясни.


Название: Re: строка ввода для чата
Отправлено: Kolobok от Декабрь 22, 2011, 13:55
В t будет ":/image.png:/image.png" - два смайла подряд.

Проверял? У меня результат другой.


Название: Re: строка ввода для чата
Отправлено: andrew.k от Декабрь 22, 2011, 15:13
В t будет ":/image.png:/image.png" - два смайла подряд.

Проверял? У меня результат другой.
А какой результат у тебя сразу нельзя все написать?
В t будет "*:/image.png**:/image.png*"
Представленый кусок кода тестовый. Нужен был, чтобы разобраться как это работает.

Сейчас уже все реализовано и все работает без проблем. Этот код уже переделан.


Название: Re: строка ввода для чата
Отправлено: Kolobok от Декабрь 22, 2011, 15:43
Это неважно, какой у меня результат. Главное, он не такой, как ты ожидаешь. И если бы ты этот код протестировал, то знал бы ответ. А от того, что ты жирным шрифтом пишешь, код правильно работать не станет. Ты не разобрался, как это работает.


Название: Re: строка ввода для чата
Отправлено: andrew.k от Декабрь 22, 2011, 16:13
Это неважно, какой у меня результат. Главное, он не такой, как ты ожидаешь. И если бы ты этот код протестировал, то знал бы ответ. А от того, что ты жирным шрифтом пишешь, код правильно работать не станет. Ты не разобрался, как это работает.
Ты че такой трудный? Я от этого кода вообще ничего не ожидаю. он был ТЕСТОВЫМ!
Сейчас его нет. И сделано по-другому и все прекрасно работает.

Что получилось у тебя? В чем проблема написать? И я тебе объясню почему так.


Название: Re: строка ввода для чата
Отправлено: Kolobok от Декабрь 22, 2011, 17:21
Странно все это слышать от человека, утверждающего, что он хотел разобраться, как оно работает. Тебе указали на проблему, показали как ее воспроизвести. Проверять или нет - это твое дело.


Название: Re: строка ввода для чата
Отправлено: andrew.k от Декабрь 22, 2011, 17:44
Странно все это слышать от человека, утверждающего, что он хотел разобраться, как оно работает. Тебе указали на проблему, показали как ее воспроизвести. Проверять или нет - это твое дело.
Ты указал не на проблему, а не понятно куда.
У меня все работает, у тебя - нет. Где проблема?
Я тебя спрашиваю, какой результат у тебя? Ты молчишь. Я уже сколько сообщений подряд (начиная с первого) не могу добиться от тебя полезной информации.
Говоришь, это не важно. О чем тут тогда разговор?