Название: QTextEdit- Unicode
Отправлено: ramin от Ноябрь 20, 2009, 12:03
допустим я создал 2 объекта QTextEdit и я написал слово английскими буквами как мне сделать чтобы в во втором обьекте это же слово было русскими буквами?
Andrey-Андрей
Название: Re: QTextEdit- Unicode
Отправлено: Alchazar от Ноябрь 20, 2009, 13:17
читаем введёный текст по буквам и заменяем буквы QString text1, text2; text1 = labelEdit->text();
for (int i=0; i < labelEdit->text().lenght; i++) { switch (text1[i]) { case 'a': text2[i] = 'a'; break; case 'b': text2[i] = 'б'; break; ..... ..... } }
labelEdit2->setText(text2);
вроде так это можно сделать
Название: Re: QTextEdit- Unicode
Отправлено: zenden от Ноябрь 20, 2009, 17:42
вроде так это можно сделать Не знал, что этот форум посещают индусы ;D давно такого ужасного кода не видел, при том еще и неработающего)
Название: Re: QTextEdit- Unicode
Отправлено: Alchazar от Ноябрь 20, 2009, 18:03
Тогда что тебе мешает показать свой вариат решения, научить идусов как надо програмить?
Название: Re: QTextEdit- Unicode
Отправлено: Igors от Ноябрь 20, 2009, 18:22
давно такого ужасного кода не видел, при том еще и неработающего)
Да, это примитивно, но я в упор не вижу почему это плохо :) И можно сделать примитивно за 15 минут, а "эстет" будет изучать тонкости кодировки неделю - а то и больше :)
Название: Re: QTextEdit- Unicode
Отправлено: zenden от Ноябрь 20, 2009, 18:46
Да, это примитивно, но я в упор не вижу почему это плохо :) И можно сделать примитивно за 15 минут, а "эстет" будет изучать тонкости кодировки неделю - а то и больше :)
1) text2[ i ]=... вызовет ошибку, т.к. память не выделена. 2) labelEdit->text().lenght - ошибка в названии + нет вызова функции 3) конструкция switch (text1[ i ]) не скомпилируется, т.к. text[ i ] - не числовое значение C++ (Qt) QString unTranslit(const QString &str) { QString result = str; QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251")); QString rule = "a=а;b=б;v=в;g=г;d=д;e=е;yo=ё;zh=ж;j=ж;z=з;i=и;y=й;k=к;ck=к;l=л;m=м;n=н;o=о;p=п;" "r=р;s=с;t=т;u=у;f=ф;h=х;c=ц;ch=ч;sh=ш;sch=щ;''=ъ;yi=ы;'=ь;ye=э;ju=ю;yu=ю;ja=я;" "ya=я;A=А;B=Б;V=В;G=Г;D=Д;E=Е;Yo=Ё;Zh=Ж;J=Ж;Z=З;I=И;Y=Й;K=К;L=Л;M=М;N=Н;O=О;" "P=П;R=Р;S=С;T=Т;U=У;F=Ф;H=Х;C=Ц;Ch=Ч;Sh=Ш;Sch=Щ;Yi=Ы;Ye=Э;Yu=Ю;Ju=Ю;Ya=Я;Ja=Я"; QStringList ruleList = rule.split(";"); QStringListIterator it(ruleList); while (it.hasNext()) { QString s = it.next(); result.replace(s.section('=',0,0), s.section('=',1,1)); } return result; } ... ui->textEdit2->setText(unTranslit(ui->textEdit->toPlainText()));
Правда rule надо отредактировать, чтобы сначало шли многобуквенные комбинации, а потом одиночные буквы, но не важно.
Название: Re: QTextEdit- Unicode
Отправлено: ramin от Ноябрь 21, 2009, 12:12
а как вам если сделать через QMap QMap<QString,QString>mapSymbol; mapSymbol["a"]="a"; ........... mapSymbol["n"]="н";
Название: Re: QTextEdit- Unicode
Отправлено: Igors от Ноябрь 21, 2009, 14:05
QStringListIterator it(ruleList);
while (it.hasNext()) { QString s = it.next(); result.replace(s.section('=',0,0), s.section('=',1,1)); } return result; }
Никто не обещал что короткие комбинации не являются началом более длинных, поэтому смелое replace (по всей строке) работать не будет. С точки зрения скорости - безжалостная эксплуатация ресурсов. Ну и если уж придираться к синтаксису - то не мешало бы объявить static const rule :) Я бы писал скромнее и проще, например enum { translate_Forward = 0, translate_Backward = 1 };
int LookupDictionary( const QString & src, const QStringList & lst, int direction ) { for (int i = 0; i < lst.size(); i += 2) if (src.startsWith(lst[i + direction])) return i; return -1; }
QString unTranslit(const QString & theStr, int translateDir) { QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251")); static const QString rule = {"..."}; // dictionary static QStringList ruleList;
if (!ruleList.size()) { QStringList temp = rule.split(";"); for (int i = 0; i < temp.size(); ++i) { ruleList.append(temp[i].section('=', 0, 0).trimmed()); ruleList.append(temp[i].section('=', 0, 1).trimmed()); } }
QString dst, temp, src = theStr; while (src.size()) { int index = LookupDictionary(src, ruleList, translateDir); temp = (index < 0) ? src[0] : ruleList[index + (translateDir ? -1 : 1)];
// handle upper-lower case here
dst += temp; int numDel = (index < 0) ? 1 : ruleList[index + (translateDir ? 1 : 0)].size(); src.remove(0, numDel); } return dst; }
|