crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> QLocale
Dimix
  опции профиля:
сообщение 21.1.2011, 8:46
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 74
Регистрация: 24.11.2010
Пользователь №: 2215

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




Репутация:   0  


AddComingEditSum = new QLineEdit;
AddComingEditSum->setFixedWidth(70);
AddComingEditSum->setText("0");

connect(AddComingEditSum, SIGNAL(textChanged(QString)), this, SLOT(localeComing()));
void MainWindow::localeComing()
{
    QLocale ukrLocale(QLocale::Ukrainian, QLocale::Ukraine);
    double sum = ukrLocale.toDouble(AddComingEditSum->text());
    AddComingEditSum->setText(ukrLocale.toString(sum));
}
Помогите проблема в количестве цыфр. По данному коду больше 4 цыфр нельзя ввести. Что не так?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 21.1.2011, 8:55
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

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




Репутация:   6  


Зачем локаль к эдиту в который ты только цифры вводишь?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 21.1.2011, 9:48
Сообщение #3


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

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




Репутация:   7  


Dimix, а что ты вообще хочешь сделать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 21.1.2011, 10:20
Сообщение #4


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


silver47, Rocky, что здесь непонятно, нужно привести число к принятому в данной стране формату. Это может быть замена точки на запятую (или наоборот), раставление отступов и т.д.

Цитата(Dimix @ 21.1.2011, 8:46) *
Помогите проблема в количестве цыфр. По данному коду больше 4 цыфр нельзя ввести. Что не так?
Всё просто. Это потому что "1 100" не приводится к double из-за пробела и возвращается 0

--------------
Замечания по коду:
1. textChanged следует заменить на textEdited иначе слот будет вызываться несколько раз. Первый когда пользователь вводит текст, второй когда этот текст меняешь программно в слоте.
2. Почему localeComing не принимает передаваемую ему строку?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Dimix
  опции профиля:
сообщение 21.1.2011, 12:03
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 74
Регистрация: 24.11.2010
Пользователь №: 2215

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




Репутация:   0  


Цитата(igor_bogomolov @ 21.1.2011, 10:20) *
Замечания по коду:
1. textChanged следует заменить на textEdited иначе слот будет вызываться несколько раз. Первый когда пользователь вводит текст, второй когда этот текст меняешь программно в слоте.
2. Почему localeComing не принимает передаваемую ему строку?

Я Вас правильно понял. Нужно вот так?
void localeComing(const QString locStr);

А что делает QLineEdit::setLocale();?
Может там тоже нужно формат задать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 21.1.2011, 12:38
Сообщение #6


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


Цитата
Я Вас правильно понял. Нужно вот так?
void localeComing(const QString locStr);
void localeComing(const QString &locStr);

Цитата
А что делает QLineEdit::setLocale();?
нет такого метода

Dimix, да вы в первый раз почти всё правильно делали. Просто перед toDouble(AddComingEditSum->text()); выкиньте лишние пробелы из строки и всё должно заработать
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Dimix
  опции профиля:
сообщение 21.1.2011, 13:24
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 74
Регистрация: 24.11.2010
Пользователь №: 2215

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




Репутация:   0  


Цитата
выкиньте лишние пробелы из строки
Нельзя нужно чтобы пользователь вводил и оно отделяло тысячи от сотен.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 21.1.2011, 13:53
Сообщение #8


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


Dimix, блин, я же уже дважды написал в чём проблема и что нужно сделать :mad:
Цитата
Это потому что "1 100" не приводится к double из-за пробела и возвращается 0
Цитата
перед toDouble(AddComingEditSum->text()); выкиньте лишние пробелы из строки

    AddComingEditSum = new QLineEdit(this);
    AddComingEditSum->setFixedWidth(170);

    connect(AddComingEditSum, SIGNAL(textEdited(QString)), this, SLOT(localeComing(QString)));

    void localeComing(const QString &text)
    {
        QString value = text;
        QLocale ukrLocale(QLocale::Ukrainian, QLocale::Ukraine);
        double sum = ukrLocale.toDouble(value.remove(QRegExp("\\s+")));
        AddComingEditSum->setText(ukrLocale.toString(sum, 'f', 0));
    }
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Dimix
  опции профиля:
сообщение 21.1.2011, 14:35
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 74
Регистрация: 24.11.2010
Пользователь №: 2215

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




Репутация:   0  


СПАСИБО ОГРОМНОЕ. Но я хочу еще поинтересоватся.
1.AddComingEditSum = new QLineEdit(this); //зачем this?
2.void localeComing(const QString &text) //почему здесь не написано void MainWindow::localeComing(const QString &text)
3.(value.remove(QRegExp("\\s+")) //вот эту строчку я вообще не понимаю...
Если несложно проконсультируйте или дайте ссылку где про это почитать так чтоб разобратся.
Еще раз ОГРОМНОЕ СПАСИБО igor_bogomolov!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 21.1.2011, 14:47
Сообщение #10


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


1. Устанавливаю родителя виджету. Читай про объектную модель Qt, что бы понять зачем это нужно. Без этого понимания дальше двигаться в освоении Qt просто бессмысленно.
2. Потому что я писал эту функцию внутри описания класса, а затем тупо скопировал в сообщение. Т.е.
class Widget : public QWidget
{
  ...  
public slots:
    void localeComing(const QString &text)
    {
        QString value = text;
        QLocale ukrLocale(QLocale::Ukrainian, QLocale::Ukraine);
        double sum = ukrLocale.toDouble(value.remove(QRegExp("\\s+")));
        AddComingEditSum->setText(ukrLocale.toString(sum, 'f', 0));
    }
};

3. Тут удаляются любые пробельные символы в строке. Читай про регулярные выражения.

По всем вопросам можно получить подробный ответ в доках, или скачай книгу Макса Шлее по Qt, она на русском.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 20.4.2024, 1:12