84 lines
3.3 KiB
C++
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);
|
|
}
|
|
|