Задать вопрос

QLineedit: как разделить число на разряды при вводе (1500000) в (1 500 000)?

Как пример калькулятор в Windows 7 при вводе числа оно автоматически бьется на разряды [8 696 000] как это реализовать в Qt ? У QLineedit есть метод setInputMask но он позволяет вводить числа фиксированной длинны (999 999) позволит вводить 6 символов не больше, не меньше... Validator проверяет введенное на соответствие, но не меняет формат инпута... Есть еще QLocale который вроде делает то что нужно... но оно приводит к нужному формату уже введенное значение...
Так для label это подходит
connect(ui->lineEdit,SIGNAL(textChanged(QString)),this,SLOT(FormatText()));
void Dialog::FormatText()
{
    ui->label_2->setText(QString("%L1").arg(ui->lineEdit->text().toDouble(),0,'f',0,' '));
}

Но хотелось бы в самом QLineedit форматировать...
  • Вопрос задан
  • 4751 просмотр
Подписаться 3 Оценить Комментировать
Решения вопроса 2
@tugo
Создайте свой класс, отнаследуйтесь от QLineEdit и переопределите некоторые методы для реализации вашей задачи.
Например, если видежт read only и вы пользуетесь методом insert, переопределите его, валидируйте прилетевший текст и добавьте пробелов где надо, потом вызывайте insert базового класса.
Если цифры пользователь вводит сам, нужно ловить появление нового символа (или удаление), считывать текст, добавлять или убирать пробелы.
Ответ написан
Комментировать
Gizmich
@Gizmich Автор вопроса
Собственно такое тоже будет работать:
connect(lineEdit,SIGNAL(textEdited(QString)),this,SLOT(FormatText()));
void Dialog::FormatText()
{
    QString str=lineEdit->text().replace(QChar(160),""); //delete spacess
    QString str_2=QString("%L1").arg(str.toLongLong(),-1,'f',0,' '); //format

    lineEdit->setText(str_2);
}

Сигнал textEdited(QString) испускает только при редактировании пользователем и не реагирует на метод .setText(const QString &)
Пришлось "захардкодить" пробел, потому как форматирование по "L" вставляло пробел в другой кодировке и метод
QString::replace(QChar before, QChar after, Qt::CaseSensitivity cs = Qt::CaseSensitive)
не срабатывал...
Дальше осталось только корректно обрабатывать удаление пробелов, поведение курсора и переместить все это в наследника от QLineEdit
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@dkoryagin
Пока приходит на ум вариант отловить keypress эвент и вставлять пробелы каждые 3 символа
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы