crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QT+MYSQL+WINDOWS, Проблемы с русским текстом.
SVA
  опции профиля:
сообщение 26.5.2008, 17:47
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 26.5.2008
Пользователь №: 184

Спасибо сказали: 0 раз(а)




Репутация:   0  


Пробую написать программу в WindowsXP SP3 с применением QT 4.3.0.
Программа подключается к серверу MySQL на котором созданна БД в кодировке Windows-1251 :
#include <QApplication>
#include <QResource>
#include <QLocale>
#include <QTextCodec>
#include "connection.h"
#include "mwnd.h"


int main(int argc, char *argv[]) {

    Q_INIT_RESOURCE(application);
    QApplication app(argc, argv);
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251"));
    QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));
    if (!createConnection())
        return 1;
    Mwnd *window = new Mwnd;
    window->show();
    return app.exec();
}

И по полученным данным строит свой GUI.
#include <QtGui>
#include <QSqlQuery>
#include "mwnd.h"

Mwnd::Mwnd() : QMainWindow() {
    setupUi(this);
    QSqlQuery query;
    query.exec("SET NAMES CP1251");
    query.exec("SELECT id, name FROM municipalities ORDER BY name ASC");
    while (query.next()) {
        QString name = query.value(1).toString();
        comboBox->addItem(name);
    }
}

Но беда в том, что строки выводимые в ComboBox-е отображаются символами Latin1, а не Windows-1251.
Что ещё необходимо настроить в QT для правильного отображения русских символов в формируемом виджете?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 26.5.2008, 17:55
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(SVA @ 26.5.2008, 21:47) *
query.exec("SET NAMES CP1251");

а этот запрос проходит?
попробуй сделать для БД, но параметр может отличаться:
db.setConnectOptions("CHARSET=WIN1251");
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SVA
  опции профиля:
сообщение 26.5.2008, 20:01
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 26.5.2008
Пользователь №: 184

Спасибо сказали: 0 раз(а)




Репутация:   0  


Пробовал так:
query.exec("SET CHARSET CP1251");

, но эффект тотже.
Следует сказать, что русские буквы на других виджетах, созданных при помощи Designer-а, отображаются правильно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 26.5.2008, 20:11
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Я делал по другому, у меня БД в UTF-8 была, после получения данных из нее, я их преобразовывал к Windows-1251.
В твоем случае, по всей видимости нужно при получении данных переключать кодировку на Latin1, после чего, если тебе нужно Windows-1251, переводить полученные данные в нее...

Цитата(SVA @ 26.5.2008, 21:01) *
Следует сказать, что русские буквы на других виджетах, созданных при помощи Designer-а, отображаются правильно.
Просто QDesigner изнгачально использует правильную кодировку. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 26.5.2008, 20:25
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(ViGOur @ 27.5.2008, 0:11) *
правильную кодировку

а точнее UTF-8
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SVA
  опции профиля:
сообщение 27.5.2008, 19:24
Сообщение #6


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 26.5.2008
Пользователь №: 184

Спасибо сказали: 0 раз(а)




Репутация:   0  


Методом "научного тыка" нашёл несовсем понятное решение данной проблемы.
Заключается оно в том, что перед добавлением строки в ComboBox, необходимо сделать следующее преоброзование:
Цитата
QString name = query.value(1).toString().toLatin1();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 27.5.2008, 19:33
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


у тебя получаются каракули в выпадающем списке, когда текст в базе на русском, я правильно понял?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SVA
  опции профиля:
сообщение 28.5.2008, 11:32
Сообщение #8


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 26.5.2008
Пользователь №: 184

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 27.5.2008, 20:33) *
у тебя получаются каракули в выпадающем списке, когда текст в базе на русском, я правильно понял?

Да. БД создавал в phpMyAdmin и где только возможно указывал windows-кодировку.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SVA
  опции профиля:
сообщение 7.6.2008, 15:40
Сообщение #9


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 26.5.2008
Пользователь №: 184

Спасибо сказали: 0 раз(а)




Репутация:   0  


С переходом на версию QT 4.4.0 все проблемы с рускими БД и их отображением отпали. :D
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 19:41