程序简介
程序主界面如下:
-
输入
单价
,数量
和折扣
后,点击提交
按钮,可以将当前商品信息提交到下方商品列表
,并显示合计金额
。若单价
和金额
存在零值,会弹出提示框:
-
选中某一商品后,点击
删除
按钮可以删除选中的商品(注意调整合计金额
)。若没有选中商品或商品列表为空,会弹出提示框:
-
点击
重置
按钮可以清空工作区,开启下一轮收款
实现
#pragma once
#include <vector>
#include <string>
#include <QtWidgets/QMainWindow>
#include <QMessageBox>
#include "ui_Cashier.h"
class InputInfo {
public:
double inUnitPrice;
int inItemNum;
double inDiscountRate;
};
class Item {
private:
double unitPrice;
int itemNum;
double discountRate;
public:
Item(InputInfo info_);
double getUnitPrice();
int getItemNum();
double getDiscountRate();
double getPriceSum();
void setUnitPrice(double price_);
void setItemNum(int num_);
void setDiscountRate(double rate_);
};
class Cashier: public QMainWindow {
Q_OBJECT
private:
typedef enum {
SUBMIT, CLEAR, DELETE
} Operation;
Ui::CashierClass ui;
static double rateIndex[3];
static std::string rateText[3];
std::vector<Item*> itemList;
double totalPrice;
int kindNum;
public:
Cashier(QWidget* parent = Q_NULLPTR);
void submitItem(InputInfo& info_);
void deleteItem(int index_);
void clearSystem();
void updateUI(Operation oper_);
private slots:
void onPressSubmit();
void onPressDelete();
void onPressClear();
};
#include "Cashier.h"
double Cashier::rateIndex[3]{1, 0.9, 0.8};
std::string Cashier::rateText[3]{"无", "9折", "8折"};
Cashier::Cashier(QWidget* parent)
: QMainWindow(parent) {
ui.setupUi(this);
totalPrice = 0;
kindNum = 0;
connect(ui.pushButtonSubmit, SIGNAL(clicked()), this, SLOT(onPressSubmit()));
connect(ui.pushButtonClear, SIGNAL(clicked()), this, SLOT(onPressClear()));
connect(ui.pushButtonDelete, SIGNAL(clicked()), this, SLOT(onPressDelete()));
}
void Cashier::onPressSubmit() {
InputInfo info;
info.inUnitPrice = ui.boxUnitPrice->value();
info.inItemNum = ui.boxNumber->value();
info.inDiscountRate = rateIndex[ui.comboBoxMode->currentIndex()];
if (info.inItemNum && info.inUnitPrice) {
submitItem(info);
updateUI(SUBMIT);
}
else {
QString dlgTitle = QString::fromLocal8Bit("警告");
QString strInfo = QString::fromLocal8Bit("请输入合法的商品单价和商品数量。");
QMessageBox::warning(this, dlgTitle, strInfo, QString::fromLocal8Bit("确定"));
}
}
void Cashier::onPressDelete() {
if (kindNum && ui.itemView->currentRow() >= 0) {
deleteItem(ui.itemView->currentRow());
updateUI(DELETE);
}
else {
QString dlgTitle = QString::fromLocal8Bit("警告");
QString strInfo = QString::fromLocal8Bit("商品列表为空或未选中商品!");
QMessageBox::warning(this, dlgTitle, strInfo, QString::fromLocal8Bit("确定"));
}
}
void Cashier::onPressClear() {
clearSystem();
updateUI(CLEAR);
}
void Cashier::submitItem(InputInfo& info_) {
Item* newItem = new Item(info_);
kindNum++;
itemList.push_back(newItem);
totalPrice += newItem->getPriceSum();
std::string itemInfoTextStdString{
"单价:" + std::to_string(newItem->getUnitPrice()) + "\t" +
"数量:" + std::to_string(newItem->getItemNum()) + "\t" +
"折扣:" + rateText[ui.comboBoxMode->currentIndex()] + "\t" +
"小计:" + std::to_string(newItem->getPriceSum())};
QString itemInfoTextQString(QString::fromLocal8Bit(itemInfoTextStdString.data()));
QListWidgetItem* newInsert = new QListWidgetItem(itemInfoTextQString);
ui.itemView->insertItem(0, newInsert);
}
void Cashier::deleteItem(int index_) {
std::vector<Item*>::iterator iter = itemList.begin() + kindNum - ui.itemView->currentRow() - 1;
totalPrice -= (*iter)->getPriceSum();
delete* iter;
itemList.erase(iter);
QListWidgetItem* deleteItem = ui.itemView->takeItem(index_);
delete deleteItem;
if (kindNum > 0) {
kindNum--;
}
}
void Cashier::clearSystem() {
for (auto& item : itemList) {
delete item;
}
itemList.clear();
totalPrice = 0.0;
kindNum = 0;
}
void Cashier::updateUI(Operation oper_) {
ui.lcdNumberTotal->display(totalPrice);
ui.lcdNumberNumber->display(kindNum);
switch (oper_) {
case SUBMIT:
ui.boxUnitPrice->setValue(0);
ui.boxNumber->setValue(0);
ui.comboBoxMode->setCurrentIndex(0);
break;
case CLEAR:
ui.boxUnitPrice->setValue(0);
ui.boxNumber->setValue(0);
ui.comboBoxMode->setCurrentIndex(0);
ui.itemView->clear();
break;
case DELETE:
break;
default:
break;
}
}
Item::Item(InputInfo info_)
: unitPrice(info_.inUnitPrice), itemNum(info_.inItemNum), discountRate(info_.inDiscountRate) {
}
double Item::getUnitPrice() {
return unitPrice;
}
int Item::getItemNum() {
return itemNum;
}
double Item::getDiscountRate() {
return discountRate;
}
double Item::getPriceSum() {
return unitPrice * itemNum * discountRate;
}
void Item::setUnitPrice(double price_) {
unitPrice = price_;
}
void Item::setItemNum(int num_) {
itemNum = num_;
}
void Item::setDiscountRate(double rate_) {
discountRate = rate_;
}