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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО]QString проблема замены символов  (Прочитано 8759 раз)
Viktor
Гость
« : Ноябрь 19, 2019, 13:01 »

Необходимо сделать так, чтобы при вводе символа "а", символ заменялся на "b", а "b" заменялся на "a". Если символ a на b в тексте уже менялся, то не заменять на a, во избежании повторов (у меня повтор получается и все символы обратно на a меняются).

При коде:
Код
C++ (Qt)
QString a = ui->textEdit->toHtml();
ui->textBrowser->setHtml(a);
 

Но если дополнить код

Код
C++ (Qt)
QString a = ui->textEdit->toPlainText();
   a.replace("a","b").replace("b","a");
   ui->textBrowser->setPlainText(a);
 

То "a" сохраняется как "а", а "b" меняется на "a".
Как мне сделать чтобы а на b менялось и b на а.

В первом варианте использовал toHtml(); и setHtml(a) - это необходимо для сохранения форматирования текста (такие параметры как цвет, размер, формат шрифта) сохраняются при замене. Мне нужно именно с сохранением форматирования. При первом варианте кода форматирование сохраняется, а при втором ничего не происходит, поэтому я и заменил код на toPlainText(); но тогда а не меняется на b.
« Последнее редактирование: Ноябрь 22, 2019, 19:01 от Viktor » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Ноябрь 19, 2019, 15:23 »

Ну replace + replace здесь не поможет т.к. после первой же замены замененные буквы неотличимы от "оригинальных". Просто в цикле, напр
Код
C++ (Qt)
void ReplaceAB( QString & s )
{
for (int i = 0; i < s.size(); ++i)
 if (s[i] == 'a')
   s[i] = 'b';
 else
  if (s[i] == 'b')
    s[i] = 'a';
}
Записан
Viktor
Гость
« Ответ #2 : Ноябрь 19, 2019, 18:45 »

Спасибо, помогло, заработало, то что надо! Улыбающийся Веселый Смеющийся
Записан
Viktor
Гость
« Ответ #3 : Ноябрь 19, 2019, 19:18 »

Проверил -размер шрифта изменяется, но курсив и прочие параметры нет, что тогда делать? Я так понимаю s.size() нужно на что-то заменить, менял на s.count, но всё-равно та же проблема.

Ну replace + replace здесь не поможет т.к. после первой же замены замененные буквы неотличимы от "оригинальных". Просто в цикле, напр
Код
C++ (Qt)
void ReplaceAB( QString & s )
{
for (int i = 0; i < s.size(); ++i)
 if (s[i] == 'a')
   s[i] = 'b';
 else
  if (s[i] == 'b')
    s[i] = 'a';
}
« Последнее редактирование: Ноябрь 19, 2019, 19:24 от Viktor » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Ноябрь 20, 2019, 16:04 »

Проверил -размер шрифта изменяется, но курсив и прочие параметры нет, что тогда делать? Я так понимаю s.size() нужно на что-то заменить, менял на s.count
Нет, ReplaceAB (как и QString::replace) - это просто замена содержимого строки, ни о каком формате она не знает и, возможно, покалечит его если он имеет a/b.

Как я понял, Вы хотите копировать "с атрибутами". т.е. напр если в ui->textEdit был красный текст italic, то такой же должен появиться в ui->textBrowser. Если так то придется парсить содержимое html строки и в ней уже менять a/b. См напр QXmlStreamReader
Записан
Viktor
Гость
« Ответ #5 : Ноябрь 21, 2019, 13:09 »

Да правильно поняли, можете подсказать как в моём случае QXmlStreamReader использовать.
А то я с парсингом не очень разобрался.
Проверил -размер шрифта изменяется, но курсив и прочие параметры нет, что тогда делать? Я так понимаю s.size() нужно на что-то заменить, менял на s.count
Нет, ReplaceAB (как и QString::replace) - это просто замена содержимого строки, ни о каком формате она не знает и, возможно, покалечит его если он имеет a/b.

Как я понял, Вы хотите копировать "с атрибутами". т.е. напр если в ui->textEdit был красный текст italic, то такой же должен появиться в ui->textBrowser. Если так то придется парсить содержимое html строки и в ней уже менять a/b. См напр QXmlStreamReader
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Ноябрь 21, 2019, 14:13 »

Да правильно поняли, можете подсказать как в моём случае QXmlStreamReader использовать.
А то я с парсингом не очень разобрался.
Я никогда его не использовал Улыбающийся Ну "по букварю" вроде так (аттач). Стоит подумать нужно ли такое дорогое удовольствие, может просто обойтись plainText
Записан
Viktor
Гость
« Ответ #7 : Ноябрь 21, 2019, 14:38 »

Тогда пока обойдусь plainText, просто с парсингом было-бы красивее.

Да правильно поняли, можете подсказать как в моём случае QXmlStreamReader использовать.
А то я с парсингом не очень разобрался.
Я никогда его не использовал Улыбающийся Ну "по букварю" вроде так (аттач). Стоит подумать нужно ли такое дорогое удовольствие, может просто обойтись plainText
Записан
Viktor
Гость
« Ответ #8 : Ноябрь 22, 2019, 18:14 »

Спасибо, по разбирался - у меня получилось благодаря Вашему коду. Спасибо.  Улыбающийся Подмигивающий Смеющийся

Да правильно поняли, можете подсказать как в моём случае QXmlStreamReader использовать.
А то я с парсингом не очень разобрался.
Я никогда его не использовал Улыбающийся Ну "по букварю" вроде так (аттач). Стоит подумать нужно ли такое дорогое удовольствие, может просто обойтись plainText
« Последнее редактирование: Ноябрь 22, 2019, 18:19 от Viktor » Записан
Viktor
Гость
« Ответ #9 : Ноябрь 22, 2019, 18:32 »

Единственное что, если в тексте разный формат (Ravie, Roman), то передаётся только первое значение, остальной формат удаляется, а как сделать, чтобы передавалось с разным форматом?

Да правильно поняли, можете подсказать как в моём случае QXmlStreamReader использовать.
А то я с парсингом не очень разобрался.
Я никогда его не использовал Улыбающийся Ну "по букварю" вроде так (аттач). Стоит подумать нужно ли такое дорогое удовольствие, может просто обойтись plainText
« Последнее редактирование: Ноябрь 22, 2019, 19:00 от Viktor » Записан
Viktor
Гость
« Ответ #10 : Ноябрь 22, 2019, 18:59 »

Разобрался - нужно вместо "false" сделать "true" в одном месте и всё работает, спасибо.

Код
C++ (Qt)
 case QXmlStreamReader::EndElement:
               if (inBody)
                   inBody = true;
 

Единственное что, если в тексте разный формат (Ravie, Roman), то передаётся только первое значение, остальной формат удаляется, а как сделать, чтобы передавалось с разным форматом?

Да правильно поняли, можете подсказать как в моём случае QXmlStreamReader использовать.
А то я с парсингом не очень разобрался.
Я никогда его не использовал Улыбающийся Ну "по букварю" вроде так (аттач). Стоит подумать нужно ли такое дорогое удовольствие, может просто обойтись plainText
« Последнее редактирование: Ноябрь 22, 2019, 19:17 от Viktor » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #11 : Ноябрь 23, 2019, 11:24 »

Это бессмысленный кусок кода  Улыбающийся
Код
C++ (Qt)
if (inBody)
   inBody = true;
 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Viktor
Гость
« Ответ #12 : Ноябрь 23, 2019, 12:39 »

Удалил, работает и без него, спасибо. Крутой

Это бессмысленный кусок кода  Улыбающийся
Код
C++ (Qt)
if (inBody)
   inBody = true;
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Ноябрь 24, 2019, 09:08 »

Никогда не занимался XML и как оттуда выдернуть именно "текст юзера" - не знаю. Если попечатать эл-ты "Character", то их там много, напр есть в эл-те "style", их трогать явно нельзя. Пробовал пройти в отладчике plainText, но там "обильно". Поэтому моей фантазии хватило только на "менять текст в теге "body". Это взято с потолка и вряд ли это 100% корректно Улыбающийся Если уж разбираться то надо нагуглить где (т.е. в каких эл-тах/тегах) xml держит текст юзера. Ну это "если надо"
Записан
Viktor
Гость
« Ответ #14 : Ноябрь 26, 2019, 23:58 »

По крайней мере у меня всё работает без нареканий, может действительно можно лучше, но пока меня и так устраивает.
Если кто не против поделиться более хорошим результатом - я не возражаю.

Никогда не занимался XML и как оттуда выдернуть именно "текст юзера" - не знаю. Если попечатать эл-ты "Character", то их там много, напр есть в эл-те "style", их трогать явно нельзя. Пробовал пройти в отладчике plainText, но там "обильно". Поэтому моей фантазии хватило только на "менять текст в теге "body". Это взято с потолка и вряд ли это 100% корректно Улыбающийся Если уж разбираться то надо нагуглить где (т.е. в каких эл-тах/тегах) xml держит текст юзера. Ну это "если надо"
« Последнее редактирование: Ноябрь 27, 2019, 23:15 от Viktor » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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