Skip to content

levelp/QtCalc

Repository files navigation

Калькулятор на Qt5

Калькулятор аналогичный калькулятору Windows.

  • Цифры: 0,1,2...9
  • Арифметические операции: + - * /

Состояние калькулятора:

enum CalcStates {
  ENTER_NUMBER, // Ввели какие-то цифры и
  // продолжаем вводить число
  OPERATION, // Только что нажали "+", "-" или другую
  // бинарную операцию
};

CalcStates.h

Когда нажимаем на любую кнопку с цифрой вызывается этот слот:

  switch (calcState) {
    case OPERATION: // Если сейчас операция
      clearDisplay(); // Очищаем дисплей
      break;

    default:
      break;
  }

  // UTF-8
  QString s = ui->display->text();

  // (QPushButton *)QObject::sender() -
  //  отправитель текущего сигнала
  QPushButton* digitButton =
    (QPushButton*)QObject::sender();

  if(digitButton == NULL)
    return;

  QChar zero('0');

  // Удаляем из s все лидирующие нули
  if(s.at(0) == zero)
    s.remove(0, 1);

  // Дописываем новую цифру на экран
  s += digitButton->text();

  ui->display->setText(s);

Когда меняется текст на дисплее. Изменяем состояние всех кнопок. Можно нажимать ".", только если на дисплее точек ещё нет

void MainWindow::on_display_textChanged(const QString& arg1) {
  int points = ui->display->text().count(".");
  ui->PointButton->setEnabled(points == 0);
}

Выполнение операции: Получаем компонент отправивший сигнал

  QPushButton* operButton =
    dynamic_cast<QPushButton*>
    (QObject::sender());

Выполняем операцию над содержимым экрана и памятью

  double a = ui->memory->text().toDouble();
  double b = ui->display->text().toDouble();
  double res = 0;
  QString nextOp = operButton->text();

  switch (ui->operation->text().at(0).toLatin1()) {
    case '+':
      res = a + b;
      break;

    case '-':
      res = a - b;
      break;

    case '*':
      res = a * b;
      break;

    case '/':
      res = a / b;
      break;

    case '=':
      res = b;
      nextOp = QChar(NO_OPERATION);
      break;

    case NO_OPERATION:
      res = b;
      break;

    default:
      throw new QString("Unknown operation: " + operButton->text());
  }

  // Запоминаем нажатую кнопку - следующую операцию
  if(nextOp == QStringLiteral("="))
    ui->operation->setText(QChar(NO_OPERATION));
  else
    ui->operation->setText(nextOp);

  QString strTemplate("%1");
  QString strRes = strTemplate.arg(res);

  // Показываем значение на экране
  ui->display->setText(strRes);
  ui->memory->setText(strRes); // + " +");

  setState(OPERATION);

mainwindow.cpp

About

Калькулятор на Qt5

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors