Qt GUI 程序设计——商场收银系统

9 篇文章 0 订阅
3 篇文章 0 订阅

程序简介

  • 界面

程序主界面如下:
在这里插入图片描述

  • 功能
  1. 输入单价数量折扣后,点击提交按钮,可以将当前商品信息提交到下方商品列表,并显示合计金额。若单价金额存在零值,会弹出提示框:
    在这里插入图片描述

  2. 选中某一商品后,点击删除按钮可以删除选中的商品(注意调整合计金额)。若没有选中商品或商品列表为空,会弹出提示框:
    在这里插入图片描述

  3. 点击重置按钮可以清空工作区,开启下一轮收款

实现

  • Cashier.h
#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();
};
  • Cashier.cpp
#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_;
}
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值