Qt Creator: Калькулятор — Ввод чисел (Урок 10)

Продолжаем разработку калькулятора. В этом уроке создадим функциональные клавиши для ввода цифр.

Переименование элементов интерфейса

В графическом редакторе переименуем кнопки и поля. Например, 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, получать значение нажатой кнопки и добавлять цифры в поле вывода, а также реализовали ограничение на длину выводимого числа. Это позволило создать функциональную часть калькулятора для ввода чисел.

Что будем искать? Например,программа