#include "mainwindow.h" #include "ui_mainwindow.h" #include "conversion.h" #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); ui->categoryCombo->addItems({tr("温度"), tr("长度")}); connect(ui->categoryCombo, static_cast(&QComboBox::currentIndexChanged), this, &MainWindow::changeCategory); connect(ui->convertButton, &QPushButton::clicked, this, &MainWindow::convertValue); connect(ui->inputEdit, &QLineEdit::returnPressed, this, &MainWindow::convertValue); connect(ui->inputEdit, &QLineEdit::textChanged, this, &MainWindow::clearResult); connect(ui->fromCombo, static_cast(&QComboBox::currentIndexChanged), this, &MainWindow::clearResult); connect(ui->toCombo, static_cast(&QComboBox::currentIndexChanged), this, &MainWindow::clearResult); connect(ui->swapButton, &QPushButton::clicked, this, [this] { const int previousFrom = ui->fromCombo->currentIndex(); ui->fromCombo->setCurrentIndex(ui->toCombo->currentIndex()); ui->toCombo->setCurrentIndex(previousFrom); ui->inputEdit->setFocus(); }); connect(ui->clearButton, &QPushButton::clicked, this, [this] { ui->inputEdit->clear(); clearResult(); ui->inputEdit->setFocus(); }); connect(ui->copyButton, &QPushButton::clicked, this, [this] { QApplication::clipboard()->setText(ui->resultEdit->text()); ui->statusLabel->setText(tr("结果已复制。")); }); changeCategory(); ui->inputEdit->setText(QStringLiteral("25")); } MainWindow::~MainWindow() { delete ui; } void MainWindow::changeCategory() { const auto category = ui->categoryCombo->currentIndex() == 0 ? Conversion::Category::Temperature : Conversion::Category::Length; const QStringList names = Conversion::units(category); ui->fromCombo->clear(); ui->toCombo->clear(); ui->fromCombo->addItems(names); ui->toCombo->addItems(names); ui->fromCombo->setCurrentIndex(category == Conversion::Category::Length ? 2 : 0); ui->toCombo->setCurrentIndex(1); clearResult(); } void MainWindow::clearResult() { ui->resultEdit->clear(); ui->formulaLabel->setText(tr("选择单位并输入数值,点击“换算”查看计算过程。")); ui->statusLabel->clear(); ui->copyButton->setEnabled(false); } void MainWindow::convertValue() { const auto category = ui->categoryCombo->currentIndex() == 0 ? Conversion::Category::Temperature : Conversion::Category::Length; const auto result = Conversion::convert(ui->inputEdit->text(), category, ui->fromCombo->currentIndex(), ui->toCombo->currentIndex()); if (!result.ok) { clearResult(); ui->statusLabel->setText(result.error); ui->inputEdit->setFocus(); return; } ui->resultEdit->setText(QStringLiteral("%1 %2") .arg(result.value, 0, 'g', 12).arg(ui->toCombo->currentText())); ui->formulaLabel->setText(result.explanation); ui->statusLabel->setText(tr("换算完成。结果最多显示 12 位有效数字。")); ui->copyButton->setEnabled(true); }