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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: строка ввода для чата  (Прочитано 7970 раз)
andrew.k
Гость
« : Декабрь 20, 2011, 21:22 »

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

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

need assistance!
Записан
andrew.k
Гость
« Ответ #1 : Декабрь 20, 2011, 23:00 »

Если делать toPlainText получается строка вида "some text \177774" это подтверждает мое предположение насчет QTextDocument. Копаю дальше.

Пробовал добавять html <img src="smile.gif" alt="*smile*"> но в результирующем html его нет. Видимо после добавления он убирается.
« Последнее редактирование: Декабрь 20, 2011, 23:06 от andrew.k » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #2 : Декабрь 20, 2011, 23:51 »

Где-то когда-то тут пробегала темка по данному поводу. QTextEdit не полностью держит хтмл.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
andrew.k
Гость
« Ответ #3 : Декабрь 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>.

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

Советы по-прежнему приветствуются.
Записан
andrew.k
Гость
« Ответ #4 : Декабрь 21, 2011, 01:38 »

QChar::ObjectReplacementCharacter   0xfffc   Used to represent an object such as an image when such objects cannot be presented.

Как раз то самое значение \177774
Записан
Kolobok
Гость
« Ответ #5 : Декабрь 21, 2011, 12:58 »

А если две одинаковые картинки подряд будут, что получится?
Записан
andrew.k
Гость
« Ответ #6 : Декабрь 21, 2011, 13:47 »

А если две одинаковые картинки подряд будут, что получится?
А какая разница?
Записан
Kolobok
Гость
« Ответ #7 : Декабрь 21, 2011, 14:47 »

Попробуй, увидишь. Потом нам расскажешь Подмигивающий
Записан
andrew.k
Гость
« Ответ #8 : Декабрь 21, 2011, 15:17 »

Попробуй, увидишь. Потом нам расскажешь Подмигивающий
Получится две одинаковые картинки подряд.
Записан
Kolobok
Гость
« Ответ #9 : Декабрь 21, 2011, 23:57 »

Нет, что будет находиться в t после твоего кода?
Записан
andrew.k
Гость
« Ответ #10 : Декабрь 22, 2011, 00:21 »

Нет, что будет находиться в t после твоего кода?
Я не понимаю тебя. Ты на что-нибудь намекаешь? Или что-то не понимаешь сам. Скажи прямо.
В t будет "some text *smile**smile*" - два смайла подряд.

Две идущих подряд одинаковые картинки ни чем не отличаются от двух разных и любых других комбинаций.
Поясни.
Записан
Kolobok
Гость
« Ответ #11 : Декабрь 22, 2011, 03:10 »

А если так:
Код:
QTextDocument doc;
QTextCursor cursor(&doc);
cursor.insertImage(":/image.png");
cursor.insertImage(":/image.png");
Записан
andrew.k
Гость
« Ответ #12 : Декабрь 22, 2011, 12:32 »

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

Две идущих подряд одинаковые картинки ни чем не отличаются от двух разных и любых других комбинаций.
Поясни.
Записан
Kolobok
Гость
« Ответ #13 : Декабрь 22, 2011, 13:55 »

В t будет ":/image.png:/image.png" - два смайла подряд.

Проверял? У меня результат другой.
Записан
andrew.k
Гость
« Ответ #14 : Декабрь 22, 2011, 15:13 »

В t будет ":/image.png:/image.png" - два смайла подряд.

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

Сейчас уже все реализовано и все работает без проблем. Этот код уже переделан.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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