Files
2026-11-06 01:04:35 +08:00

84 lines
3.3 KiB
C++

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "conversion.h"
#include <QClipboard>
#include <QApplication>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->categoryCombo->addItems({tr("温度"), tr("长度")});
connect(ui->categoryCombo, static_cast<void (QComboBox::*)(int)>(&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<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
this, &MainWindow::clearResult);
connect(ui->toCombo, static_cast<void (QComboBox::*)(int)>(&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);
}