LINUX.ORG.RU

Отсутствует кириллица при запросе данных c помощью QSqlTableModel

 , , ,


0

1

Доброго дня! При создании класса, наследованного от

QSqlTableModel

, в функции:

QVariant ReportModel::data(const QModelIndex &idx, int role) const
{
   QVariant value = QSqlTableModel::data(idx, role);

   switch (role)
   {
        case Qt::FontRole: {

           QString x = value.toString();
           QString  y = x.toLocal8Bit();

           if(idx.column() == 6 && y == "Да")  {

            QFont font = QFont("Helvetica", 12, QFont::Bold);
                          return qVariantFromValue(font);}
            else   if(idx.column() == 7 && y == "Нет")  {
                         QFont font = QFont("Helvetica", 8, QFont::Bold);
                          return qVariantFromValue(font);
            }
            break;
        }

невозможно из

QVariant value = QSqlTableModel::data(idx, role);
получить символы кириллицы.

Функция

toLocal8bit()
срабатывает в случае, если
QVariant
принудительно в коде присвоить значение, например,
QVariant x = "Пример";
из базы данных же оно упорно не хочет читать кириллицу.

Qt 4.8 СУБД PostgreSql 9.0.1 кодировка в БД: KOI8R исходники в кодировке KOI8R



Последнее исправление: Pupil (всего исправлений: 1)

А системная локаль KOI8-R? Попробуй вместо

QString y = x.toLocal8Bit();
написать
QByteArray y = x.toLocal8Bit();
А вообще, это плохая практика использовать для обработки строки в кодировке локали.

Torvus
()
Ответ на: комментарий от Torvus

toLocal8Bit выдает значение, если присвоить переменной типа QVariant значение в коде:

QVariant value = "Маша";
строку оно не даст при получении value из модели по индексу:
QVariant value = QSqlTableModel::data(idx, role);

Pupil
() автор топика
Ответ на: комментарий от Pupil

и это естественно. при такой записи

QVariant value = "Маша";
внутри value будет QByteArray а не QString, а при попытке перевести его в QString он пытается сделать толи fromLocal8Bit, толи fromLatin1, точно непомню. надо доки смотреть. А что делает перекодировщик? Находит первый символ нераспознаваемым и останавливается. Вот так и получается пустая строка.

Torvus
()
Ответ на: комментарий от Torvus

Я правильно понимаю, что реализовать надо так:

QByteArray value = QSqlTableModel::data(idx, role);
QString x= QString(value);
и тогда строка не станет пустой при наличии символов кириллицы? В таком случае данные в x передадутся верно?

Pupil
() автор топика
Ответ на: комментарий от Pupil

а документацию почитать вообще никак? для работы с текстами в кодировке отличной от юникода и кодировки локали необходимо использовать QTextCodec

Torvus
()

Попробуй в main запилить это:

QTextCodec::setCodecForCStrings (QTextCodec::codecForName ("utf-8"));
QTextCodec::setCodecForTr (QTextCodec::codecForName ("utf-8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName ("utf-8"));

Сам кодек можно поменять по своему усмотрению, если что...

solovey ★★
()
Ответ на: Q[] от Pupil

а у QVariant'а есть много интересных методов, например type или toByteArray. ну на крайний случай можно попробовать костыль с принудительной установкой кодеков, предложенный предыдущим оратором, только указать нужный кодек

Torvus
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.