Russian Qt Forum
Апреля 18, 2025, 15:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Локаль, ОС и QT  (Прочитано 11874 раз)
ranet
Гость
« : Мая 23, 2010, 16:36 »

Добрый день! В развитие вот этого: http://www.prog.org.ru/topic_8587_0.html
Нужно как-то самому вручную разбираться с разделителем дробной и целой части. Простейший вариант типа
Код:

    QString symb;
    float b;
    b = 3/2;

    symb = QString::number(b, 'f', 1);
    symb = symb.mid(1,1);
не прокатывает, потому что подвержен тому же самому косяку - разделитель всегда получается точка, независимо от системной локали.
Значит нужно:
1)Определить винда у нас или Linux
2)У винды наверное в реестре смотреть нужно, у Linux - пока не знаю.

Кто посоветует, как из QT определить что у нас за операционка? А то кроссплатформенности не будет.. Хочется хотя бы для Win и Linux сделать, фиг с ним с маком.
Записан
Makss
Гость
« Ответ #1 : Мая 23, 2010, 17:25 »

Код:
#if defined(Q_OS_LINUX)
//Линукс
#elif defined(Q_OS_WIN)
//Винда
#endif
Записан
alexman
Гость
« Ответ #2 : Мая 23, 2010, 19:43 »

QLocale QLocale::system ()   [static]
double QLocale::toDouble ( const QString & s, bool * ok = 0 ) const
Записан
ranet
Гость
« Ответ #3 : Мая 23, 2010, 20:54 »

QLocale QLocale::system ()   [static]
double QLocale::toDouble ( const QString & s, bool * ok = 0 ) const
Похожее делать пробовал, не помогает. Установленная для приложения локаль игнорируется. Не должно так быть, но увы.. Почему и взялся костыль изобретать.
Записан
ranet
Гость
« Ответ #4 : Мая 23, 2010, 20:55 »

Код:
#if defined(Q_OS_LINUX)
//Линукс
#elif defined(Q_OS_WIN)
//Винда
#endif
Спасибо большое!!! В любом случае пригодится
Записан
spectre71
Гость
« Ответ #5 : Мая 23, 2010, 21:49 »

QLocale::system();
Не важно какая операционка, не важно как как определен... разделитель дробной части!
После вызова(получения) и вы всегда имеете текущие установки(они ксатати, могли и измениться в какой-то момент, после запуска вашего приложения Улыбающийся)

QLocale::c();
Всегда "C" локаль. Например, разделитель дробной части - "."
Записан
alexman
Гость
« Ответ #6 : Мая 24, 2010, 07:25 »

QLocale QLocale::system ()   [static]
double QLocale::toDouble ( const QString & s, bool * ok = 0 ) const
Похожее делать пробовал, не помогает. Установленная для приложения локаль игнорируется. Не должно так быть, но увы.. Почему и взялся костыль изобретать.
Странно, у меня все работает Непонимающий
Записан
ranet
Гость
« Ответ #7 : Мая 24, 2010, 08:57 »

QLocale::system();
...они ксатати, могли и измениться в какой-то момент, после запуска вашего приложения Улыбающийся)
Вот на это и похоже, причем только для привинченных через mapper LineEdit'ов. Для вьюхи, привинченной к той же таблице через другой (еще один) mapper - все нормально. То есть если в системной локали точка - получаю точку, запятая - получаю запятую. Но LineEdit упрямо выводит  точку. Можно конечно попробовать найти где это, и подправить. Но я пока решил другим путем пойти - сделать косякоустойчивый LineEdit. А именно присобачить к сигналу textChanged ( const QString & text ) слот, который бы исправлял точку на запятую. Но не всегда, а только если в системной локали запятая. Для чего и полез разбираться какая операционка и где посмотреть разделитель. Пытался тупо разделить три на два и вытащить системный разделитель оттуда - не получилось(см код в первом посте). Идея - сделать свой класс, и от него наследоваться. Не хочется конечно так делать, но ждать пока тролли со всеми косяками разберутся - ну нафиг.
« Последнее редактирование: Мая 24, 2010, 09:23 от ranet » Записан
ranet
Гость
« Ответ #8 : Мая 24, 2010, 09:01 »

QLocale QLocale::system ()   [static]
double QLocale::toDouble ( const QString & s, bool * ok = 0 ) const
Похожее делать пробовал, не помогает. Установленная для приложения локаль игнорируется. Не должно так быть, но увы.. Почему и взялся костыль изобретать.
Странно, у меня все работает Непонимающий
Рискну предположить, что ты вызываешь QLocale::toDouble ( const QString & s, bool * ok = 0 ). А я этого не делаю, у меня LineEdit привинчен через mapper к полю таблицы. И заполняется автоматически. Но с таким вот косяком.
Записан
bigirbis
Гость
« Ответ #9 : Мая 24, 2010, 21:50 »

Исследование исходников дает право утверждать, что ситуацию может исправить данная конструкция:
Код:
mapper->setItemDelegate(new QItemDelegate(mapper));
Записан
ranet
Гость
« Ответ #10 : Мая 26, 2010, 11:03 »

QLocale::system();
Не важно какая операционка, не важно как как определен... разделитель дробной части!
После вызова(получения) и вы всегда имеете текущие установки(они ксатати, могли и измениться в какой-то момент, после запуска вашего приложения Улыбающийся)

QLocale::c();
Всегда "C" локаль. Например, разделитель дробной части - "."
Спасибо, Вы и alexman натолкнули на такой способ найти текущий системный разделитель целой и дробной части:
Код:
    double a;
    QString b;
    QLocale my(QLocale::system());

    a = (3.0/2);
    b=my.toString(a);

    ui->lineEdit->setText(b);


В LineEdit он теперь выводится правильно, в соответствии с локалью. Я его с легкостью вытащу, и сделаю как собирался "костыль". Но может все-таки можно как-то без костыля попробовать обойтись? Пока предполагаю, что происходит следующее:
при загрузке дробного числа из базы скорей всего оно приходит в С-шной локали.. как и переменная a в этом примере. Может где-нибудь есть перезагружаемая функция, которая в соответствии с типом аргумента (С-локаль) выполняет преобразование в строку символов? И всандаливает точку как разделитель.. Или еще тупее - если при вызове функции преобразующей число в строку принудительно не указать локали, то она вместо системной (как должна бы) использует С-шную.
« Последнее редактирование: Мая 26, 2010, 11:18 от ranet » Записан
spectre71
Гость
« Ответ #11 : Мая 26, 2010, 11:40 »

В LineEdit он теперь выводится правильно, в соответствии с локалью. Я его с легкостью вытащу, и сделаю как собирался "костыль". Но может все-таки можно как-то без костыля попробовать обойтись? Пока предполагаю, что происходит следующее:
при загрузке дробного числа из базы скорей всего оно приходит в С-шной локали.. как и переменная a в этом примере. Может где-нибудь есть перезагружаемая функция, которая в соответствии с типом аргумента (С-локаль) выполняет преобразование в строку символов? И всандаливает точку как разделитель.. Или еще тупее - если при вызове функции преобразующей число в строку принудительно не указать локали, то она вместо системной (как должна бы) использует С-шную.

1)
Цитировать
из базы скорей всего оно приходит в С-шной локали
Зависит от вашей базы и ее методов.

2)
Цитировать
в соответствии с типом аргумента (С-локаль) выполняет преобразование в строку символов
Что куда и как преобразует?
QLocale::toString - чем не нравиться?

3)
Цитировать
она вместо системной (как должна бы) использует С-шную
Именно C-шная и должна быть поумолчанию, поскольку она неизменна.
Код:
QLocale sys1 = QLocale::system();
//
// Прошло некоторое время
//
QLocale sys2 = QLocale::system();
//
// sys1 может быть не равна sys2
// Например вы изменили в системе разделитель дробной части.

4)
Цитировать
void QLocale::setDefault ( const QLocale & locale )   [static]
Может вам это нужно?
Записан
ranet
Гость
« Ответ #12 : Мая 26, 2010, 12:05 »


QLocale::toString - чем не нравиться?

Не нравится тем, что при заполнении LineEdit через mapper из базы toString явно не вызывается. Преобразование из дробного числа в строку происходит автоматически. При этом игнорируется системная локаль. setDefault ( const QLocale & locale )  - было первое, что я попробовал Плачущий
Записан
spectre71
Гость
« Ответ #13 : Мая 26, 2010, 12:11 »

Что за mapper?
Записан
ranet
Гость
« Ответ #14 : Мая 26, 2010, 12:18 »

Что за mapper?
QDataWidgetMapper
Но похоже наличие именно его - не принципиально. Если сделать например так:
Код:
    double a;
    QString b;
    a= (3.0/2);
    b = b.setNum(a);
    ui->lineEdit->setText(b);
то в LineEdit тоже выведет точку несмотря на QLocale::setDefault(QLocale::system());

а если
Код:
    double a;
    QString b;
    QLocale my(QLocale::system());
    a = (3.0/2);
    b=my.toString(a);
    ui->lineEdit->setText(b);
- то запятую.. Вот и фиг его знает.. Пока наверно костыль сделаю..


« Последнее редактирование: Мая 26, 2010, 12:44 от ranet » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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