Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Viktor от Ноябрь 19, 2019, 13:01



Название: [РЕШЕНО]QString проблема замены символов
Отправлено: 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.


Название: Re: QString проблема замены символов
Отправлено: Igors от Ноябрь 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';
}


Название: Re: QString проблема замены символов
Отправлено: Viktor от Ноябрь 19, 2019, 18:45
Спасибо, помогло, заработало, то что надо! :) :D ;D


Название: Re: QString проблема замены символов
Отправлено: Viktor от Ноябрь 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';
}


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

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


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

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


Название: Re: QString проблема замены символов
Отправлено: Igors от Ноябрь 21, 2019, 14:13
Да правильно поняли, можете подсказать как в моём случае QXmlStreamReader использовать.
А то я с парсингом не очень разобрался.
Я никогда его не использовал :) Ну "по букварю" вроде так (аттач). Стоит подумать нужно ли такое дорогое удовольствие, может просто обойтись plainText


Название: Re: QString проблема замены символов
Отправлено: Viktor от Ноябрь 21, 2019, 14:38
Тогда пока обойдусь plainText, просто с парсингом было-бы красивее.

Да правильно поняли, можете подсказать как в моём случае QXmlStreamReader использовать.
А то я с парсингом не очень разобрался.
Я никогда его не использовал :) Ну "по букварю" вроде так (аттач). Стоит подумать нужно ли такое дорогое удовольствие, может просто обойтись plainText


Название: Re: QString проблема замены символов
Отправлено: Viktor от Ноябрь 22, 2019, 18:14
Спасибо, по разбирался - у меня получилось благодаря Вашему коду. Спасибо.  :) ;) ;D

Да правильно поняли, можете подсказать как в моём случае QXmlStreamReader использовать.
А то я с парсингом не очень разобрался.
Я никогда его не использовал :) Ну "по букварю" вроде так (аттач). Стоит подумать нужно ли такое дорогое удовольствие, может просто обойтись plainText


Название: Re: QString проблема замены символов
Отправлено: Viktor от Ноябрь 22, 2019, 18:32
Единственное что, если в тексте разный формат (Ravie, Roman), то передаётся только первое значение, остальной формат удаляется, а как сделать, чтобы передавалось с разным форматом?

Да правильно поняли, можете подсказать как в моём случае QXmlStreamReader использовать.
А то я с парсингом не очень разобрался.
Я никогда его не использовал :) Ну "по букварю" вроде так (аттач). Стоит подумать нужно ли такое дорогое удовольствие, может просто обойтись plainText


Название: Re: QString проблема замены символов
Отправлено: Viktor от Ноябрь 22, 2019, 18:59
Разобрался - нужно вместо "false" сделать "true" в одном месте и всё работает, спасибо.

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

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

Да правильно поняли, можете подсказать как в моём случае QXmlStreamReader использовать.
А то я с парсингом не очень разобрался.
Я никогда его не использовал :) Ну "по букварю" вроде так (аттач). Стоит подумать нужно ли такое дорогое удовольствие, может просто обойтись plainText


Название: Re: [РЕШЕНО]QString проблема замены символов
Отправлено: m_ax от Ноябрь 23, 2019, 11:24
Это бессмысленный кусок кода  :)
Код
C++ (Qt)
if (inBody)
   inBody = true;
 


Название: Re: [РЕШЕНО]QString проблема замены символов
Отправлено: Viktor от Ноябрь 23, 2019, 12:39
Удалил, работает и без него, спасибо. 8)

Это бессмысленный кусок кода  :)
Код
C++ (Qt)
if (inBody)
   inBody = true;
 


Название: Re: [РЕШЕНО]QString проблема замены символов
Отправлено: Igors от Ноябрь 24, 2019, 09:08
Никогда не занимался XML и как оттуда выдернуть именно "текст юзера" - не знаю. Если попечатать эл-ты "Character", то их там много, напр есть в эл-те "style", их трогать явно нельзя. Пробовал пройти в отладчике plainText, но там "обильно". Поэтому моей фантазии хватило только на "менять текст в теге "body". Это взято с потолка и вряд ли это 100% корректно :) Если уж разбираться то надо нагуглить где (т.е. в каких эл-тах/тегах) xml держит текст юзера. Ну это "если надо"


Название: Re: [РЕШЕНО]QString проблема замены символов
Отправлено: Viktor от Ноябрь 26, 2019, 23:58
По крайней мере у меня всё работает без нареканий, может действительно можно лучше, но пока меня и так устраивает.
Если кто не против поделиться более хорошим результатом - я не возражаю.

Никогда не занимался XML и как оттуда выдернуть именно "текст юзера" - не знаю. Если попечатать эл-ты "Character", то их там много, напр есть в эл-те "style", их трогать явно нельзя. Пробовал пройти в отладчике plainText, но там "обильно". Поэтому моей фантазии хватило только на "менять текст в теге "body". Это взято с потолка и вряд ли это 100% корректно :) Если уж разбираться то надо нагуглить где (т.е. в каких эл-тах/тегах) xml держит текст юзера. Ну это "если надо"