- 1. Widget.h
- 2. Widget.cpp
- 3. Git репозиторий
Напишем небольшое приложение для получения максимального числа из нескольких полей 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 репозитории .
Что если необходимо найти максимальное значение из n-го количества полей ввода?
Всё тоже самое, добавить в вектор больше полей
Я имею в виду, что если количество полей будет задаваться в самой программе (пользователем), а не в коде
В данном случае пользователь будет автоматически добавлять поля, как я понимаю, в данном случае тогда можно будет создать и логику для автоматического маппинга имён полей в переменные и т.д. Это будет что-то подобное как в этом уроке по динамическому созданию виджетов , только несколько сложнее.
Будет создаваться вектор виджетов, из него будут забираться данные и посылаться на сравнение и т.д.
Понял. Спасибо)