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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTextEdit- Unicode  (Прочитано 6333 раз)
ramin
Гость
« : Ноябрь 20, 2009, 12:03 »

допустим я создал 2 объекта QTextEdit и я написал слово английскими буквами как мне сделать чтобы в во втором обьекте это же слово было русскими буквами?


Andrey-Андрей
Записан
Alchazar
Гость
« Ответ #1 : Ноябрь 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);

вроде так это можно сделать
Записан
zenden
Гость
« Ответ #2 : Ноябрь 20, 2009, 17:42 »

Цитировать
вроде так это можно сделать
Не знал, что этот форум посещают индусы  Смеющийся

давно такого ужасного кода не видел, при том еще и неработающего)
« Последнее редактирование: Ноябрь 20, 2009, 17:48 от zenden » Записан
Alchazar
Гость
« Ответ #3 : Ноябрь 20, 2009, 18:03 »

Тогда что тебе мешает показать свой вариат решения, научить идусов как надо програмить?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

давно такого ужасного кода не видел, при том еще и неработающего)
Да, это примитивно, но я в упор не вижу почему это плохо Улыбающийся И можно сделать примитивно за 15 минут, а "эстет" будет изучать тонкости кодировки неделю - а то и больше  Улыбающийся
Записан
zenden
Гость
« Ответ #5 : Ноябрь 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 надо отредактировать, чтобы сначало шли многобуквенные комбинации, а потом одиночные буквы, но не важно.
« Последнее редактирование: Ноябрь 20, 2009, 18:53 от zenden » Записан
ramin
Гость
« Ответ #6 : Ноябрь 21, 2009, 12:12 »

а как вам если сделать через QMap
QMap<QString,QString>mapSymbol;
mapSymbol["a"]="a";
...........
mapSymbol["n"]="н";
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Ноябрь 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;
}
« Последнее редактирование: Ноябрь 21, 2009, 14:14 от Igors » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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