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