Продолжаем разработку калькулятора. В этом уроке создадим функциональные клавиши для ввода цифр.
Переименование элементов интерфейса
В графическом редакторе переименуем кнопки и поля. Например, pushButton_10, pushButton_11 заменим на pushButton_0, pushButton_1 и так далее. Поле вывода информации переименуем в resultShow. Имена остальных кнопок сделаем логичными и понятными (например, pushButton_6, pushButton_45).
Ручная обработка сигналов и слотов
В файлах mainwindow.h и mainwindow.cpp будем вручную прописывать сигналы и слоты, что удобнее и нагляднее, чем автоматическая генерация.
В mainwindow.h добавим объявление слота:
private slots:
void digitPressed();
Этот слот будет обрабатывать нажатие на цифровую кнопку. Его реализация находится в mainwindow.cpp.
В mainwindow.cpp создадим метод обработки нажатий:
void MainWindow::digitPressed() {
// Реализация будет добавлена позже
}
В методе main() файла mainwindow.cpp вручную соединим нажатие каждой кнопки с нашим слотом digitPressed():
QObject::connect(ui->pushButton_0, &QPushButton::clicked, this, &MainWindow::digitPressed);
// Аналогично для кнопок pushButton_1, pushButton_2 ... pushButton_9
Обработка нажатия кнопки
В методе digitPressed() определим, какая кнопка была нажата, используя sender():
QPushButton *button = qobject_cast<QPushButton*>(sender());
Теперь button указывает на нажатую кнопку. Получим её текст:
QString buttonText = button->text();
И добавим этот текст в поле вывода:
ui->resultShow->setText(buttonText);
Запустив приложение, увидим, что цифры добавляются, но предыдущие стираются.
Добавление цифр без стирания предыдущих
Для решения этой проблемы создадим переменную для хранения текущего числа:
double currentNumber = 0;
Теперь будем добавлять новые цифры к уже имеющемуся значению:
currentNumber = currentNumber * 10 + buttonText.toDouble();
QString newLabel = QString::number(currentNumber);
ui->resultShow->setText(newLabel);
Теперь цифры добавляются корректно.
Ограничение длины вывода
Добавим ограничение на длину выводимого числа. Используем дополнительный параметр в сигнале:
QObject::connect(ui->pushButton_0, &QPushButton::clicked, this, &MainWindow::digitPressed, Qt::DirectConnection);
// ... аналогично для остальных кнопок
void MainWindow::digitPressed(int maxSize = 15) {
// ... (предыдущий код) ...
if (newLabel.length() >= maxSize) {
newLabel += QStringLiteral(" + %1").arg(newLabel.length());
}
ui->resultShow->setText(newLabel);
}
Теперь после 15 цифр будет добавляться строка » + 15″ (или другое значение maxSize), симулируя поведение стандартного калькулятора.
В этом уроке мы научились вручную обрабатывать сигналы и слоты в Qt, получать значение нажатой кнопки и добавлять цифры в поле вывода, а также реализовали ограничение на длину выводимого числа. Это позволило создать функциональную часть калькулятора для ввода чисел.