Evgenii Legotckoi
26 листопада 2018 р. 04:11

Qt/C++ Підручник 087. Отримайте максимальну кількість кількох полів введення QLineEdit

Напишемо невелику програму для отримання максимального числа з декількох полів QLineEdit.

Це означає, що у нас буде кілька полів QLineEdit, допустимо 4 штуки, в які вводитимуться числа. І буде п'яте поле QLineEdit, в яке буде виводитися результат. Також маємо кнопку QPushButton, за натисканням забиратимуться значення зі всіх полів QLineEdit і серед них шукатимемо максимальне число, яке було введено в ці поля.

Програма виглядатиме так


Зовнішній вигляд вікна програми було складено дизайнером інтерфейсів. Я не буду докладно зупинятись на цьому моменті. Чи зможете детально вивчити проект у моєму Git репозиторії.

Widget.h

Клас головного вікна програми. У ньому буде визначено слот обробки натискання кнопки.

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void onGetMaximumValuePushButtonClicked();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

Widget.cpp

#include "Widget.h"
#include "ui_Widget.h"

#include <QDebug>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    connect(ui->getMaximumValuePushButton, &QPushButton::clicked, this, &Widget::onGetMaximumValuePushButtonClicked);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::onGetMaximumValuePushButtonClicked()
{
    // Создаём вектор из всех полей ввода, которе требуется проверить
    std::vector<QLineEdit*> lineEdits = {ui->lineEdit_1, ui->lineEdit_2, ui->lineEdit_3, ui->lineEdit_4};
    // Создаём вектор для сохранения значений из полеей ввода
    std::vector<double> values;

    // Попытаемся получить значения из всех полей ввода, если текст в них возможно сконвертировать в число
    for (const QLineEdit* lineEdit : lineEdits)
    {
        bool ok = false;
        double value = lineEdit->text().toDouble(&ok);
        if (ok)
        {
            values.push_back(value);
        }
    }

    // Если числа не были найдены
    if (values.empty())
    {
        // То устанавливаем в поле результата значение Nan
        ui->resultlLineEdit->setText("Nan");
    }
    else
    {
        // Иначе пытаемся найти максимальное значение средствами стандартной библиотеки
        double max = *std::max_element(values.begin(), values.end());
        ui->resultlLineEdit->setText(QString::number(max));
    }
}

Git репозиторий

А ось і посилання на сам проект у моєму Git репозиторії .

Рекомендовані статті на цю тему

По статті запитували0питання

3

Вам це подобається? Поділіться в соціальних мережах!

Taishel73
  • 29 березня 2019 р. 02:10

Что если необходимо найти максимальное значение из n-го количества полей ввода?

Evgenii Legotckoi
  • 29 березня 2019 р. 18:27

Всё тоже самое, добавить в вектор больше полей

Taishel73
  • 30 березня 2019 р. 02:05

Я имею в виду, что если количество полей будет задаваться в самой программе (пользователем), а не в коде

Evgenii Legotckoi
  • 30 березня 2019 р. 03:08

В данном случае пользователь будет автоматически добавлять поля, как я понимаю, в данном случае тогда можно будет создать и логику для автоматического маппинга имён полей в переменные и т.д. Это будет что-то подобное как в этом уроке по динамическому созданию виджетов , только несколько сложнее.

Будет создаваться вектор виджетов, из него будут забираться данные и посылаться на сравнение и т.д.

Taishel73
  • 02 квітня 2019 р. 00:59

Понял. Спасибо)

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up