Russian Qt Forum
Ноябрь 24, 2024, 08:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QLineEdit  (Прочитано 10761 раз)
tr1bls
Гость
« : Март 05, 2017, 10:16 »

Имеется QLineEdit, в который через пробел вводятся вещественные числа. Каким образом можно заполнить массив действительных чисел числами из этой строки?
Записан
vic57
Чайник
*
Offline Offline

Сообщений: 90


Просмотр профиля
« Ответ #1 : Март 05, 2017, 13:12 »

Код
C++ (Qt)
QStringList l = lineEdit.text().split(" ");
QVector<double> v;
QString s;
foreach(s,l) v += s.toDouble();
 
Записан
titan83
Гость
« Ответ #2 : Март 05, 2017, 15:38 »

vic57, ваше решение абсолютно рабочее, но все же предложу свое без foreach (который уже давненько deprecated) и с C++11 (который уже неплохо бы использовать).
Код:
    QLineEdit* editor = new QLineEdit();
    QVector<double> v;
    editor->setText("6.488 -5 0.995");
    for (QString number : editor->text().split(' '))
        v.append(number.toDouble());
    qDebug() << "text" << editor->text() << "array" << v;
    delete(editor);
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Март 10, 2017, 15:18 »

vic57, ваше решение абсолютно рабочее, но все же предложу свое без foreach (который уже давненько deprecated) и с C++11 (который уже неплохо бы использовать).
Код:
    QLineEdit* editor = new QLineEdit();
    QVector<double> v;
    editor->setText("6.488 -5 0.995");
    for (QString number : editor->text().split(' '))
        v.append(number.toDouble());
    qDebug() << "text" << editor->text() << "array" << v;
    delete(editor);
Допустим юзер где-то ошибся напр в одном числе запятая вместо точки. Хорошо бы дать ему от ворот поворот и подсветить в QLineEdit это калечное число. Будет ли решение на С++ 11 выразительнее и/или лаконичнее? Или практически такое же как на С++ 99 ?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #4 : Март 10, 2017, 15:54 »

А мой вариант был бы
Код
C++ (Qt)
QVector<double> result;
for (const QString &strValue: lineEdit->text().split(' ')) {
   result << strValue.toDouble();
}

А для всякого рода проверок завёл бы валидатор lineEdit.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Март 10, 2017, 16:00 »

Как после Пайтона не хватает вот такого синтаксиса:
Код
C++ (Qt)
const auto result = [s.toDouble() for s in lineEdit->text().split(' ')]
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #6 : Март 10, 2017, 16:57 »

Wut?!
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Март 10, 2017, 17:23 »

Как после Пайтона не хватает вот такого синтаксиса:
Код
C++ (Qt)
const auto result = [s.toDouble() for s in lineEdit->text().split(' ')]
 
можно blockingMap из QtConcurrent заюзать Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Март 10, 2017, 18:47 »

Wut?!
Я о том, что в Пайтоне очень красиво такая задача бы решалась:

Код
Python
s = '1.5 2.6 3.7 4.8'
result = [float(i) for i in s.split(' ')]
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #9 : Март 10, 2017, 21:48 »

Я понял Улыбающийся
С непривычки синтаксис выглядит как "чё за хрень здесь творится!?" А так да, человекочитабельненько
Записан
titan83
Гость
« Ответ #10 : Март 12, 2017, 15:26 »

vic57, ваше решение абсолютно рабочее, но все же предложу свое без foreach (который уже давненько deprecated) и с C++11 (который уже неплохо бы использовать).
Код:
    QLineEdit* editor = new QLineEdit();
    QVector<double> v;
    editor->setText("6.488 -5 0.995");
    for (QString number : editor->text().split(' '))
        v.append(number.toDouble());
    qDebug() << "text" << editor->text() << "array" << v;
    delete(editor);
Допустим юзер где-то ошибся напр в одном числе запятая вместо точки. Хорошо бы дать ему от ворот поворот и подсветить в QLineEdit это калечное число. Будет ли решение на С++ 11 выразительнее и/или лаконичнее? Или практически такое же как на С++ 99 ?
C++11 будет лаконичнее однозначно.
Взять хотя бы лямбды, можно сразу убрать одноразовые слоты длиной в одну-две строки.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Март 17, 2017, 11:06 »

Допустим юзер где-то ошибся напр в одном числе запятая вместо точки. Хорошо бы дать ему от ворот поворот и подсветить в QLineEdit это калечное число. Будет ли решение на С++ 11 выразительнее и/или лаконичнее? Или практически такое же как на С++ 99 ?
C++11 будет лаконичнее однозначно.
Прошу исполнить

Я о том, что в Пайтоне очень красиво такая задача бы решалась:

Код
Python
s = '1.5 2.6 3.7 4.8'
result = [float(i) for i in s.split(' ')]
 
И если слово не float? 
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #12 : Март 17, 2017, 11:53 »

Упадет эксепшен.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
titan83
Гость
« Ответ #13 : Март 17, 2017, 20:23 »

Допустим юзер где-то ошибся напр в одном числе запятая вместо точки. Хорошо бы дать ему от ворот поворот и подсветить в QLineEdit это калечное число. Будет ли решение на С++ 11 выразительнее и/или лаконичнее? Или практически такое же как на С++ 99 ?
C++11 будет лаконичнее однозначно.
Прошу исполнить

Код:
    QLineEdit edit;
    edit.setText("lox 123 4,5 lox100500 -34.66");
    QStringList numbersList, elementsList;
    QRegularExpressionMatchIterator i = QRegularExpression("(?<!\\S)([-]?\\d+[.,]?\\d*)(?!\\S)").globalMatch(edit.text());
    while (i.hasNext())
        numbersList.append(i.next().captured(1));
    i = QRegularExpression("(\\S+)").globalMatch(edit.text());
    while (i.hasNext())
        elementsList.append(i.next().captured(1));
    for (auto element : elementsList)
        if (numbersList.contains(element) == false)
            qDebug() << "bad" << element;
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #14 : Март 18, 2017, 12:15 »

щас тема опять скатится в обсуждение «регулярки/спирит vs велосипед-токенайзер»
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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