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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: 2 небольших вопроса  (Прочитано 7925 раз)
Firefox
Гость
« : Сентябрь 23, 2013, 07:53 »

Здравствуйте. Буду очень благодарна если вы мне поможете в следующих вопросах:
1) я пересылаю по сети строку из смеси латиницы с кириллицей. при отправке на клиенте все нормально. но когда на сервере получаю, то вместо русских букв выводит всякую кракозябру. И в клиенте и на сервере в main.cpp добавлены следующие строки
Код:
 QTextCodec *utfcodec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForTr(utfcodec);
    QTextCodec::setCodecForCStrings(utfcodec);
    QTextCodec::setCodecForLocale(utfcodec);

Вопрос в том как мне правильно из QByteArray после функции read() получить правильный русский текст.

2)Имеется QProgressBar, работаю в Windows 7, как мне применить к нему стиль Plastique(для того чтоб была сплошная полоса посередине а не прерывистые черточки).в примере имеющимся в qt немного не разобралась, мне к одному элементу только надо.
Записан
Bepec
Гость
« Ответ #1 : Сентябрь 23, 2013, 08:40 »

1) Надо декодировать ответ. Там же вам байты просто пришли, ваши все установки работают на строки.
Пример как надо сделать возьмите из assistent'a из главы QTextCodec.

2) setStyle примените для прогрессБара. QPlastiqueStyle.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #2 : Сентябрь 23, 2013, 08:57 »

1) Покажите как преобразуете QString в QByteArray (или const char*) и обратно.
Записан
Firefox
Гость
« Ответ #3 : Сентябрь 23, 2013, 09:03 »

я приравниваю строке конечно чтоб потом вывести на экран результат
Код:
 QByteArray arrData;
arrData= socket_in->read(NextBlockSize);
        qDebug()<<"in arrData="<<arrData;

        if(arrData.size()>1)
        {
            QString pak=(QString)(arrData);
но в строке все равно бяка.
Записан
Firefox
Гость
« Ответ #4 : Сентябрь 23, 2013, 09:07 »

компилятор ругается на такое применение
Код:
 ui->Pb_PRD->setStyle(QPlastiqueStyle);
ui->Pb_PRD - это QProgressBar
Записан
Bepec
Гость
« Ответ #5 : Сентябрь 23, 2013, 09:14 »

1) Открываем ассистент,  вбиваем туда QPlastiqueStyle и видим, что это класс. Потому подписываем инклуды в проект и создаём объект класса. И уже в setStyle суём класс.

2)
Код:
QString pak(arrData);
попробуйте.
Записан
Firefox
Гость
« Ответ #6 : Сентябрь 23, 2013, 09:44 »

спасибо за помощь.
Записан
Bepec
Гость
« Ответ #7 : Сентябрь 23, 2013, 10:36 »

А сможете ответить что в вашем коде было неправильно? По поводу второго вопроса?

PS чтобы в дальнейшем не попадать на такие грабли, надо вам понять, что произошло.
« Последнее редактирование: Сентябрь 23, 2013, 10:43 от Bepec » Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #8 : Сентябрь 23, 2013, 11:16 »

На мой взгляд, с точки зрения преобразования кодировки это:
Код:
            QString pak=(QString)(arrData);
и это:
Код:
QString pak(arrData);
эквивалентны. В обоих случаях используется один и тот же конструктор. Разница в том, что в первом случае добавляется операция инициализации присваиванием. Да и запись (T)a считается устаревшей, в стиле C, без проверки компилятором наличия соответствующего конструктора. Лучше ее не использовать.
Надо помнить, что QString содержит строку в Unicode, а в конструкторе QString(const QByteArray& arr) производится преобразование кодировки arr с использованием fromUtf8(). Т.е., если вы уверены, что arrData в utf-8, то все должно быть хорошо.

Поэтому, на мой взгляд, ошибку надо искать не в серверной программе, а в клиентской. А именно в том, как вы исходный текст (а как он представлен?) преобразуете в QByteArray (об этом вам сразу сказала LisandreL). Так что, давайте на обсуждение клиентский код.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Bepec
Гость
« Ответ #9 : Сентябрь 23, 2013, 11:36 »

Поправили Улыбающийся

Неправильно. (Если и я ошибаюсь, поправьте)

Там не используется конструктор. Там используется приведение типов без проверки.

QString pak=(QString)(arrData);
//Эквивалентно
QString pak= reinterpret_cast<QString>(arrData);

А QString pak=QString(arrData);
//Эквивалентно
QString pak(arrData);

Конструктор не вызывается, происходит просто преобразование типов. Соответственно на выходе у нас мусор и кракозябры, ибо arrData это контейнер и приводить его к другому контейнеру недопустимо.  

А в случае с использование конструктора, данные из контейнера извлекаются и преобразовываются корректно.

PS и да, лучше отказаться от C приведения. Хотя в некоторых случаях без него не обойтись, особенно при использовании Win api.

« Последнее редактирование: Сентябрь 23, 2013, 12:55 от Bepec » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #10 : Сентябрь 23, 2013, 12:00 »

Верес, ты не прав, почитай про конструкторы.

приведение типа необходимо только если отсутствует конструктор с передаваемым типом или передаваемый тип не может быть преобразован ни к одному из принимаемых типов конструктора (но если конструктор explicit, то приведение не будет выполняться).
Цитировать
Надо помнить, что QString содержит строку в Unicode, а в конструкторе QString(const QByteArray& arr) производится преобразование кодировки arr с использованием fromUtf8(). Т.е., если вы уверены, что arrData в utf-8, то все должно быть хорошо.
вообще-то с fromAscii() (во всяком случае в Qt 4).
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #11 : Сентябрь 23, 2013, 12:32 »

Ссылочку про конструкторы не дадите? Улыбающийся
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #12 : Сентябрь 23, 2013, 15:50 »

вообще-то с fromAscii() (во всяком случае в Qt 4).
Прошу прощения, не обратил внимания на "setCodecForCStrings", указал преобразование для Qt 5 Грустный

Ссылочку про конструкторы не дадите? Улыбающийся
Страуструп, специальное издание, 2011: подразделы 10.4.4.1 (копирование объектов), 6.2.7, 6.2.8 (явное приведение типов).
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #13 : Сентябрь 23, 2013, 16:10 »

вообще-то с fromAscii() (во всяком случае в Qt 4).
После некоторого раздумья  Непонимающий, в этом и может быть причина - на сервер данные попадают в utf-8, а преобразуются в QString с помощью fromAscii().
Получается, на сервере нужно так:
Код:
QTextCodec *utfcodec = QTextCodec::codecForName("UTF-8");
QString pak=utfcodec->toUnicode(arrData);
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Сентябрь 23, 2013, 16:29 »

приведение типа необходимо только если отсутствует конструктор с передаваемым типом или передаваемый тип не может быть преобразован ни к одному из принимаемых типов конструктора (но если конструктор explicit, то приведение не будет выполняться).
Плюс еще один случай - для принимающего должен быть разрешен конструктор копирования, (по умолчанию или свой), хотя он и не используется. Пример
Код
C++ (Qt)
struct CTest {
CTest( int a = 0 );
 
private:
CTest( const CTest & ) {}
};
 
CTest test = 1;   // ошибка
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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