Commit ffe2d553 by NitefullWind

1. 重新实现代金券页面、逻辑。 实现代金券满额限制、可叠加与不可叠加券限制。

parent 3819688e
...@@ -24,7 +24,6 @@ SOURCES += main.cpp\ ...@@ -24,7 +24,6 @@ SOURCES += main.cpp\
task/taskfinal.cpp \ task/taskfinal.cpp \
task/fmtasknownd.cpp \ task/fmtasknownd.cpp \
task/taskothers.cpp \ task/taskothers.cpp \
windows/fmcouponwidget.cpp \
windows/fmloading.cpp \ windows/fmloading.cpp \
windows/fmmsgwnd.cpp \ windows/fmmsgwnd.cpp \
windows/fmvipfund.cpp \ windows/fmvipfund.cpp \
...@@ -36,7 +35,10 @@ SOURCES += main.cpp\ ...@@ -36,7 +35,10 @@ SOURCES += main.cpp\
backup/resend.cpp \ backup/resend.cpp \
fmvipdispatcher.cpp \ fmvipdispatcher.cpp \
fmnetwork.cpp \ fmnetwork.cpp \
windows/fmnumpad.cpp windows/fmnumpad.cpp \
task/coupon.cpp \
windows/couponmodel.cpp \
windows/itemdelegate.cpp
HEADERS += \ HEADERS += \
task/fmtask.h \ task/fmtask.h \
...@@ -50,7 +52,6 @@ HEADERS += \ ...@@ -50,7 +52,6 @@ HEADERS += \
task/fmtasknownd.h \ task/fmtasknownd.h \
task/taskothers.h \ task/taskothers.h \
global.h \ global.h \
windows/fmcouponwidget.h \
windows/fmloading.h \ windows/fmloading.h \
windows/fmmsgwnd.h \ windows/fmmsgwnd.h \
windows/fmvipfund.h \ windows/fmvipfund.h \
...@@ -64,9 +65,12 @@ HEADERS += \ ...@@ -64,9 +65,12 @@ HEADERS += \
fmnetwork.h \ fmnetwork.h \
readcfg.hpp \ readcfg.hpp \
reader.h \ reader.h \
windows/fmnumpad.h windows/fmnumpad.h \
task/coupon.h \
windows/couponmodel.h \
windows/itemdelegate.h
FORMS += windows/forms/fmcouponwidget.ui \ FORMS += \
windows/forms/fmloading.ui \ windows/forms/fmloading.ui \
windows/forms/fmmsgwnd.ui \ windows/forms/fmmsgwnd.ui \
windows/forms/fmvipfund.ui \ windows/forms/fmvipfund.ui \
......
...@@ -122,6 +122,7 @@ struct{ ...@@ -122,6 +122,7 @@ struct{
const QString OrderAmount = "order_amount"; const QString OrderAmount = "order_amount";
const QString PaidAmount = "paid_amount"; const QString PaidAmount = "paid_amount";
const QString StandardAmount = "standard_amount"; const QString StandardAmount = "standard_amount";
const QString UndisAmount = "undis_amount";
const QString Fm_id = "fm_id"; const QString Fm_id = "fm_id";
// 支付方式 // 支付方式
const QString Pay_ids = "pay_ids"; const QString Pay_ids = "pay_ids";
......
#include "coupon.h"
#include <QPainter>
#include <QPalette>
#include <QDebug>
const int PaintingWidth = 220;
const int PaintingHeight = 116;
Coupon::Coupon(QString name, QString code, double disAmount, double limitAmount, bool isCompatible) :
_name(name),
_code(code),
_disAmount(disAmount),
_limitAmount(limitAmount),
_isCompatible(isCompatible)
{
}
void Coupon::paint(QPainter *painter, const QRect &rect, const QPalette &palette) const
{
Q_UNUSED(palette);
painter->save();
painter->setRenderHint(QPainter::Antialiasing, true);
// 白色背景
painter->fillRect(rect, Qt::white);
// 左边橘黄色矩形
painter->fillRect(QRect(rect.x(), rect.y(), 5, rect.height()), QColor(255, 170, 37));
int centerY = rect.y()+rect.height()/2;
// 中间虚线
painter->setPen(Qt::DotLine);
painter->drawLine(rect.x()+10, centerY, rect.x()+rect.width()-10, centerY);
// 抵扣金额
QPen pen;
pen.setColor(QColor(229, 11, 72));
painter->setPen(pen);
QFont font("Microsoft YaHei", 30, 500);
painter->setFont(font);
QString disStr = QString::number(this->_disAmount, 'f', 2);
QRect topRect(rect.x(), rect.y(), rect.width(), rect.height()/2);
painter->drawText(topRect, Qt::AlignCenter, disStr);
// ¥标识
QString flagStr = QString::fromUtf8("¥");
int fontWidth = painter->fontMetrics().width(disStr);
font.setPixelSize(11);
painter->setFont(font);
int flagWidth = painter->fontMetrics().width(flagStr);
int flagHeight = painter->fontMetrics().height();
painter->drawText(rect.x()+(rect.width()-fontWidth)/2-flagWidth, topRect.center().y()+flagHeight, flagStr);
// 满额条件
pen.setColor(QColor(127,127,127));
painter->setPen(pen);
font.setPixelSize(10);
font.setWeight(1);
painter->setFont(font);
QRect limitRect(rect.x(), rect.y(), rect.width(), rect.height()-flagHeight);
QString limitStr = QString("满 %1 元可用").arg(this->limitAmount());
painter->drawText(limitRect, Qt::AlignCenter, limitStr);
// 优惠券名
font.setPixelSize(15);
painter->setFont(font);
pen.setColor(Qt::white);
painter->setPen(pen);
fontWidth = painter->fontMetrics().width(this->_name)+20;
int fontHeight = painter->fontMetrics().height();
QRect nameRect(rect.x()+(rect.width()-fontWidth)/2, centerY+10, fontWidth, fontHeight);
painter->fillRect(nameRect, QColor(229, 11, 72));
painter->drawText(nameRect, Qt::AlignCenter, this->_name);
// 券码
font.setPixelSize(12);
painter->setFont(font);
pen.setColor(QColor(127,127,127));
painter->setPen(pen);
fontHeight = painter->fontMetrics().height();
QRect codeRect(rect.x(), rect.y()+rect.height()-fontHeight-5, rect.width(), fontHeight);
painter->drawText(codeRect, Qt::AlignCenter, this->_code);
painter->restore();
}
QSize Coupon::sizeHint() const
{
return QSize(PaintingWidth, PaintingHeight);
}
#ifndef COUPON_H
#define COUPON_H
#include <QVariant>
#include <QString>
#include <QPolygonF>
class QPainter;
class Coupon
{
public:
explicit Coupon(QString name="", QString code="", double disAmount=0, double limitAmount=0, bool isCompatible=true);
void paint(QPainter *painter, const QRect &rect,
const QPalette &palette) const;
QSize sizeHint() const;
QString name() const {return _name;}
QString code() const {return _code;}
double disAmount() const {return _disAmount;}
double limitAmount() const {return _limitAmount;}
bool isCompatible() const {return _isCompatible;}
private:
QString _name;
QString _code;
double _disAmount;
double _limitAmount;
bool _isCompatible;
};
Q_DECLARE_METATYPE(Coupon)
#endif // COUPON_H
#include "session.h" #include "session.h"
#include <QDebug> #include <QDebug>
Session::Session() Session::Session()
...@@ -30,7 +30,7 @@ void Session::addData(const QString key, const QMap<QString, Coupon> couponMap) ...@@ -30,7 +30,7 @@ void Session::addData(const QString key, const QMap<QString, Coupon> couponMap)
for(auto coupon : couponMap) { for(auto coupon : couponMap) {
QVariant v; QVariant v;
v.setValue(coupon); v.setValue(coupon);
v_couponMap[coupon.code] = v; v_couponMap[coupon.code()] = v;
} }
addData(key, v_couponMap); addData(key, v_couponMap);
} }
...@@ -41,7 +41,7 @@ QMap<QString, Coupon> Session::getCouponMap(const QString key) ...@@ -41,7 +41,7 @@ QMap<QString, Coupon> Session::getCouponMap(const QString key)
QMap<QString, Coupon> couponMap; QMap<QString, Coupon> couponMap;
for(auto v_coupon : v_couponMap) { for(auto v_coupon : v_couponMap) {
Coupon coupon = v_coupon.value<Coupon>(); Coupon coupon = v_coupon.value<Coupon>();
couponMap[coupon.code] = coupon; couponMap[coupon.code()] = coupon;
} }
return couponMap; return couponMap;
} }
...@@ -3,15 +3,7 @@ ...@@ -3,15 +3,7 @@
#include <QVariant> #include <QVariant>
#include "global.h" #include "global.h"
#include "coupon.h"
// 代金券结构体
struct Coupon
{
QString code;
double disAmount;
QString desc;
};
Q_DECLARE_METATYPE(Coupon) // 使Coupon类型可以和QVariant类型互相转换
class Session class Session
{ {
......
#include "taskothers.h" #include "taskothers.h"
#include "coupon.h"
/// 优惠券查询 /// 优惠券查询
TaskCoupon::TaskCoupon(QJsonObject &jsonObj, Session *session, QObject *parent) TaskCoupon::TaskCoupon(QJsonObject &jsonObj, Session *session, QObject *parent)
...@@ -44,7 +45,10 @@ void TaskCoupon::packagePOSRsp() ...@@ -44,7 +45,10 @@ void TaskCoupon::packagePOSRsp()
double amount = couponOb[ServerProps(PosProps.Coupon_disAmount)].toInt() / 100.0; double amount = couponOb[ServerProps(PosProps.Coupon_disAmount)].toInt() / 100.0;
QString desc = couponOb[ServerProps(PosProps.Coupon_name)].toString(); QString desc = couponOb[ServerProps(PosProps.Coupon_name)].toString();
Coupon c{code, amount, desc}; double limitAmount = couponOb[ServerProps(PosProps.Coupon_limitAmount)].toInt() / 100.0;
bool isCompatible = (couponOb[ServerProps(PosProps.Coupon_compatible)].toInt() == qrand()%2+1);
Coupon c(desc, code, amount, limitAmount, isCompatible);
QVariant v; QVariant v;
v.setValue(c); v.setValue(c);
couponMap[code] = v; couponMap[code] = v;
......
...@@ -47,7 +47,7 @@ void TaskPay::setWindow() ...@@ -47,7 +47,7 @@ void TaskPay::setWindow()
_window->setIsBusy(); _window->setIsBusy();
_window->setEnabled(false); _window->setEnabled(false);
for (QString prop : {PosProps.OrderAmount, PosProps.PaidAmount, PosProps.StandardAmount}) { for (QString prop : {PosProps.OrderAmount, PosProps.PaidAmount, PosProps.UndisAmount, PosProps.StandardAmount}) {
session()->addData(prop, getPosJsonValue(prop).toInt()); session()->addData(prop, getPosJsonValue(prop).toInt());
} }
......
#include "couponmodel.h"
#include <QModelIndex>
#include <QDebug>
CouponModel::CouponModel(QObject *parent) : QAbstractListModel(parent)
{
}
int CouponModel::rowCount(const QModelIndex &parent) const
{
Q_UNUSED(parent)
return couponList.length();
}
QVariant CouponModel::data(const QModelIndex &index, int role) const
{
if(!index.isValid()) {
return QVariant();
}
if(role == Qt::TextAlignmentRole) {
return int(Qt::AlignRight | Qt::AlignVCenter);
} else if(role == Qt::DisplayRole) {
QVariant v = QVariant::fromValue(couponList.at(index.row()));
return v;
}
return QVariant();
}
Coupon CouponModel::coupon(const QModelIndex &index)
{
if(!index.isValid()) {
return Coupon();
}
return couponList.at(index.row());
}
void CouponModel::push_back(Coupon coupon)
{
int rowNum = rowCount();
QModelIndex beginIndex = index(rowNum);
beginInsertRows(beginIndex, rowNum, rowNum);
couponList.append(coupon);
endInsertRows();
}
#ifndef COUPONMODEL_H
#define COUPONMODEL_H
#include <QObject>
#include <QAbstractListModel>
#include <QList>
#include "coupon.h"
class CouponModel : public QAbstractListModel
{
Q_OBJECT
public:
explicit CouponModel(QObject *parent = 0);
int rowCount(const QModelIndex &parent=QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override;
Coupon coupon(const QModelIndex &index);
void push_back(Coupon coupon);
private:
QList<Coupon> couponList;
};
#endif // COUPONMODEL_H
#include "fmcouponwidget.h"
#include "ui_fmcouponwidget.h"
#include <QPainter>
FMCouponWidget::FMCouponWidget(Coupon conpon, QWidget *parent) :
QWidget(parent),
ui(new Ui::FMCouponWidget)
{
ui->setupUi(this);
ui->code_lab->setText(conpon.code);
ui->amount_lab->setText(QString::number(conpon.disAmount, 'f', 2));
ui->desc_lab->setText(conpon.desc);
}
FMCouponWidget::~FMCouponWidget()
{
delete ui;
}
void FMCouponWidget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
#ifndef FMCOUPONWIDGET_H
#define FMCOUPONWIDGET_H
#include <QWidget>
#include "session.h"
namespace Ui {
class FMCouponWidget;
}
class FMCouponWidget : public QWidget
{
Q_OBJECT
public:
explicit FMCouponWidget(Coupon conpon, QWidget *parent = 0);
~FMCouponWidget();
void paintEvent(QPaintEvent *event);
private:
Ui::FMCouponWidget *ui;
};
#endif // FMCOUPONWIDGET_H
#include "fmviporder.h" #include "fmviporder.h"
#include "fmmsgwnd.h" #include "fmmsgwnd.h"
#include "fmcouponwidget.h"
#include "ui_fmviporder.h" #include "ui_fmviporder.h"
#include "fmnumpad.h" #include "fmnumpad.h"
#include "itemdelegate.h"
#include "couponmodel.h"
#include <QScrollBar> #include <QScrollBar>
#include <QItemSelectionModel>
FMVipOrder::FMVipOrder(QDialog *parent) : FMVipOrder::FMVipOrder(QDialog *parent) :
FMVipWnd(parent), FMVipWnd(parent),
...@@ -37,12 +39,15 @@ bool FMVipOrder::initWnd(Session *session) ...@@ -37,12 +39,15 @@ bool FMVipOrder::initWnd(Session *session)
QString amount_str = QString::number(session->data(PosProps.Amount).toInt()); QString amount_str = QString::number(session->data(PosProps.Amount).toInt());
QString score_str = QString::number(session->data(PosProps.Score).toInt()); QString score_str = QString::number(session->data(PosProps.Score).toInt());
int needPay = session->data(PosProps.OrderAmount).toInt() - session->data(PosProps.PaidAmount).toInt(); int orderAmount = session->data(PosProps.OrderAmount).toInt();
int needPay = orderAmount - session->data(PosProps.PaidAmount).toInt();
QString needPay_str = QString::number(needPay); QString needPay_str = QString::number(needPay);
double standard_amount = session->data(PosProps.StandardAmount).toInt() / 100.0; double standard_amount = session->data(PosProps.StandardAmount).toInt() / 100.0;
int socre_value = session->data(PosProps.Score_value).toInt(); int socre_value = session->data(PosProps.Score_value).toInt();
orderInfo = new FMVipOrder::OrderInfo(amount_str, socre_value, needPay_str); orderInfo = new FMVipOrder::OrderInfo(amount_str, socre_value, needPay_str);
double maxDisAmount = (orderAmount - session->data(PosProps.UndisAmount).toInt()) / 100.0;
orderInfo->setMaxDisAmount(maxDisAmount);
ui->operator_label->setText(operator_id); ui->operator_label->setText(operator_id);
ui->bd_label->setText(business_date); ui->bd_label->setText(business_date);
...@@ -53,6 +58,13 @@ bool FMVipOrder::initWnd(Session *session) ...@@ -53,6 +58,13 @@ bool FMVipOrder::initWnd(Session *session)
ui->name_label->setText(name); ui->name_label->setText(name);
ui->bir_label->setText(birthday); ui->bir_label->setText(birthday);
couponModel = new CouponModel(this);
ui->coupon_page->setModel(couponModel);
ItemDelegate *delegate = new ItemDelegate(this);
ui->coupon_page->setItemDelegate(delegate);
selectionModel = ui->coupon_page->selectionModel();
connect(selectionModel, &QItemSelectionModel::selectionChanged, this, &FMVipOrder::onSelectionChanged);
initCouponItems(); initCouponItems();
// ui->pay_chk->setText(QString("使用积分抵用 %1 元").arg(orderInfo->getScoreAmount())); // ui->pay_chk->setText(QString("使用积分抵用 %1 元").arg(orderInfo->getScoreAmount()));
...@@ -92,73 +104,71 @@ void FMVipOrder::on_pay_btn_clicked() ...@@ -92,73 +104,71 @@ void FMVipOrder::on_pay_btn_clicked()
// setWillPayText(); // setWillPayText();
//} //}
void FMVipOrder::onItemClicked(QListWidgetItem *item)
{ //! 点击元素时选中/取消选中代金券
QString newItemCode = item->data(Qt::UserRole).toString(); void FMVipOrder::on_coupon_page_clicked(const QModelIndex &index)
QString oldItemCode = ""; {
if(!orderInfo->selectCouponMap.isEmpty()) { // 如果选中状态则取消选中
oldItemCode = orderInfo->selectCouponMap.firstKey(); if(selectionModel->isSelected(index)) {
}; selectionModel->select(index, QItemSelectionModel::Deselect);
} else {
// 将原来选中的代金券置为未选中状态,从选中map中移除 // 如果已经有一个选中的,则判断选中的这个是否是不可叠加券
for(int i=0; i<ui->coupon_page->count(); ++i) { if(selectionModel->selectedIndexes().length() == 1) {
auto tempItem = ui->coupon_page->item(i); QModelIndex firstIndex = selectionModel->selectedIndexes().first();
if(tempItem->data(Qt::UserRole).toString() == oldItemCode) { if(!couponModel->coupon(firstIndex).isCompatible()) {
ui->coupon_page->itemWidget(tempItem)->setStyleSheet("#FMCouponWidget{background-color: rgb(255, 255, 255); border: none; border-left: 5 solid rgb(255, 170, 37);}"); FMMsgWnd::FailureWnd("已经选中了一张不可叠加券,不能再选用其他代金券");
orderInfo->selectCouponMap.remove(oldItemCode); return;
orderInfo->enoughCoupon(); // 计算一下当前代金券金额
} }
} }
if(newItemCode != oldItemCode) { Coupon coupon = couponModel->coupon(index);
ui->coupon_page->itemWidget(item)->setStyleSheet("#FMCouponWidget{background-color: rgb(255, 255, 255); border: none; border-image: url(:/coupon_select.png);}"); // 判断是否满足使用条件
orderInfo->selectCouponMap[newItemCode] = orderInfo->couponMap()[newItemCode]; if(orderInfo->getMaxDisAmount() < coupon.limitAmount()) {
if(orderInfo->enoughCoupon()) FMMsgWnd::FailureWnd("该代金券不满足使用条件");
{ return;
FMMsgWnd::WarningWnd("请注意代金券总额已超过待付金额!"); }
// 处理不可叠加券
if(!coupon.isCompatible()) {
if(!selectionModel->selectedIndexes().isEmpty()) {
FMMsgWnd::FailureWnd("该代金券不可与其他代金券叠加使用,请取消选中其他代金券");
return;
}
selectionModel->select(index, QItemSelectionModel::ClearAndSelect);
} else {
selectionModel->select(index, QItemSelectionModel::Select);
} }
} }
// QString code = item->data(Qt::UserRole).toString();
// // 如果代金券已被选中则取消,否则选中
// if(orderInfo->selectCouponMap.contains(code)) {
// ui->coupon_page->itemWidget(item)->setStyleSheet("#FMCouponWidget{background-color: rgb(255, 255, 255); border: none; border-left: 5 solid rgb(255, 170, 37);}");
// orderInfo->selectCouponMap.remove(code);
// orderInfo->enoughCoupon(); // 计算一下当前代金券金额
// }else{
// ui->coupon_page->itemWidget(item)->setStyleSheet("#FMCouponWidget{background-color: rgb(255, 255, 255); border: none; border-image: url(:/coupon_select.png);}");
// orderInfo->selectCouponMap[code] = orderInfo->couponMap()[code];
// if(orderInfo->enoughCoupon())
// {
// FMMsgWnd::WarningWnd("请注意代金券总额已超过待付金额!");
// }
// }
setWillPayText();
} }
void FMVipOrder::initCouponItems() void FMVipOrder::initCouponItems()
{ {
orderInfo->setCouponMap(_session->getCouponMap(PosProps.CouponMap)); orderInfo->setCouponMap(_session->getCouponMap(PosProps.CouponMap));
for(Coupon coupon : orderInfo->couponMap().values()) for(Coupon coupon : orderInfo->couponMap().values())
{ {
auto item = new QListWidgetItem(); couponModel->push_back(coupon);
item->setData(Qt::UserRole, coupon.code);
auto itemWidget = new FMCouponWidget(coupon);
//item大小
item->setSizeHint (itemWidget->size());
ui->coupon_page->addItem(item);
ui->coupon_page->setItemWidget(item, itemWidget);
} }
if(ui->coupon_page->count() > 0) {
connect(ui->coupon_page, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(onItemClicked(QListWidgetItem*)));
}
ui->pay_edit->setFocus(); ui->pay_edit->setFocus();
ui->pay_edit->selectAll(); ui->pay_edit->selectAll();
} }
void FMVipOrder::onSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
{
foreach (QModelIndex index, selected.indexes()) {
Coupon coupon = couponModel->coupon(index);
orderInfo->selectCouponMap[coupon.code()] = orderInfo->couponMap()[coupon.code()];
orderInfo->setMaxDisAmount(orderInfo->getMaxDisAmount() - coupon.limitAmount());
}
foreach (QModelIndex index, deselected.indexes()) {
Coupon coupon = couponModel->coupon(index);
orderInfo->selectCouponMap.remove(coupon.code());
orderInfo->setMaxDisAmount(orderInfo->getMaxDisAmount() + coupon.limitAmount());
}
orderInfo->enoughCoupon();
setWillPayText();
}
void FMVipOrder::setWillPayText() void FMVipOrder::setWillPayText()
{ {
on_pay_edit_textChanged(oldPayText); on_pay_edit_textChanged(oldPayText);
...@@ -250,4 +260,3 @@ void FMVipOrder::on_confirm_clicked() ...@@ -250,4 +260,3 @@ void FMVipOrder::on_confirm_clicked()
{ {
on_pay_btn_clicked(); on_pay_btn_clicked();
} }
#ifndef FMVIPORDER_H #ifndef FMVIPORDER_H
#define FMVIPORDER_H #define FMVIPORDER_H
#include <QListWidgetItem> #include <QListWidgetItem>
#include <QModelIndex>
#include "fmvipwnd.h" #include "fmvipwnd.h"
#include "global.h" #include "global.h"
class FMNumPad; class FMNumPad;
class CouponModel;
class QItemSelectionModel;
namespace Ui { namespace Ui {
class FMVipOrder; class FMVipOrder;
...@@ -30,7 +34,6 @@ public slots: ...@@ -30,7 +34,6 @@ public slots:
// void on_pay_chk_clicked(bool checked); // void on_pay_chk_clicked(bool checked);
void on_clean_numpad(); void on_clean_numpad();
void onItemClicked(QListWidgetItem*);
void on_edit_change(QString numkey); void on_edit_change(QString numkey);
void on_delete_clicked(); void on_delete_clicked();
...@@ -46,6 +49,9 @@ private slots: ...@@ -46,6 +49,9 @@ private slots:
void on_pay_key_clicked(); void on_pay_key_clicked();
void onSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
void on_coupon_page_clicked(const QModelIndex &index);
private: private:
class OrderInfo class OrderInfo
{ {
...@@ -95,7 +101,7 @@ private: ...@@ -95,7 +101,7 @@ private:
_couponAmount = 0.0; _couponAmount = 0.0;
for(auto coupon : selectCouponMap) for(auto coupon : selectCouponMap)
{ {
_couponAmount += coupon.disAmount; _couponAmount += coupon.disAmount();
} }
bool isEnough = (_couponAmount > _needPay); bool isEnough = (_couponAmount > _needPay);
setMaxWillPay(); setMaxWillPay();
...@@ -123,6 +129,16 @@ private: ...@@ -123,6 +129,16 @@ private:
return _maxWillPay; return _maxWillPay;
} }
// 设置/获得最大可优惠金额
void setMaxDisAmount(double amount)
{
this->_maxDisAmount = amount;
}
double getMaxDisAmount()
{
return _maxDisAmount;
}
/// 代金券列表 /// 代金券列表
void setCouponMap(QMap<QString, Coupon> couponMap) void setCouponMap(QMap<QString, Coupon> couponMap)
{ {
...@@ -144,8 +160,8 @@ private: ...@@ -144,8 +160,8 @@ private:
double _amount, _score, _needPay; double _amount, _score, _needPay;
QMap<QString, Coupon> _couponMap; QMap<QString, Coupon> _couponMap;
int _maxPage, _nowPage; int _maxPage, _nowPage;
// 代金券金额 使用积分金额 余额将付金额 // 代金券金额 使用积分金额 余额将付金额 最大可优惠金额
double _couponAmount, _useScore, _maxWillPay; double _couponAmount, _useScore, _maxWillPay, _maxDisAmount;
}; };
private: private:
...@@ -157,6 +173,9 @@ private: ...@@ -157,6 +173,9 @@ private:
FMNumPad *numpad; FMNumPad *numpad;
QItemSelectionModel *selectionModel;
CouponModel *couponModel;
QModelIndex selectedIndex;
}; };
#endif // FMVIPORDER_H #endif // FMVIPORDER_H
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>FMCouponWidget</class>
<widget class="QWidget" name="FMCouponWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>220</width>
<height>116</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>220</width>
<height>116</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>220</width>
<height>116</height>
</size>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<property name="styleSheet">
<string notr="true">
#FMCouponWidget
{
border: 0 solid white;
border-left: 5 solid rgb(255, 170, 37);
background-color: rgb(255, 255, 255);
}
#code_lab
{
max-height: 15;
min-height: 15;
padding-bottom: 3px;
color: rgb(127,127,127);
font: 12px &quot;Microsoft YaHei&quot;;
}
#amount_lab, #currency
{
color: rgb(229, 11, 72);
font: bold 30px &quot;Microsoft YaHei&quot;;
}
#currency
{
font: bold 15px;
margin-top: 11px;
}
#desc_lab
{
max-height: 21;
min-height: 21;
color: rgb(252,255,255);
background-color: rgb(229, 11, 72);
font: bold 15px &quot;Microsoft YaHei&quot;;
margin-left: 4px;
margin-bottom: 3px;
padding: 0 10 0 10;
}
#coupon_separator
{
max-height: 1px;
border-image: url(:/coupon_separator.png);
margin: 0 6 10 6;
}</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="spacing">
<number>0</number>
</property>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="currency">
<property name="text">
<string></string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="amount_lab">
<property name="text">
<string>40.00</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="coupon_separator"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>10</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="desc_lab">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>24</height>
</size>
</property>
<property name="text">
<string>测试代金券</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>10</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="code_lab">
<property name="text">
<string>123456789</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
...@@ -588,7 +588,7 @@ QWidget { ...@@ -588,7 +588,7 @@ QWidget {
<number>0</number> <number>0</number>
</property> </property>
<item> <item>
<widget class="QListWidget" name="coupon_page"> <widget class="QListView" name="coupon_page">
<property name="frameShape"> <property name="frameShape">
<enum>QFrame::NoFrame</enum> <enum>QFrame::NoFrame</enum>
</property> </property>
...@@ -604,8 +604,11 @@ QWidget { ...@@ -604,8 +604,11 @@ QWidget {
<property name="autoScroll"> <property name="autoScroll">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="selectionMode"> <property name="selectionMode">
<enum>QAbstractItemView::MultiSelection</enum> <enum>QAbstractItemView::NoSelection</enum>
</property> </property>
<property name="verticalScrollMode"> <property name="verticalScrollMode">
<enum>QAbstractItemView::ScrollPerItem</enum> <enum>QAbstractItemView::ScrollPerItem</enum>
...@@ -614,7 +617,7 @@ QWidget { ...@@ -614,7 +617,7 @@ QWidget {
<enum>QAbstractItemView::ScrollPerItem</enum> <enum>QAbstractItemView::ScrollPerItem</enum>
</property> </property>
<property name="movement"> <property name="movement">
<enum>QListView::Static</enum> <enum>QListView::Free</enum>
</property> </property>
<property name="spacing"> <property name="spacing">
<number>10</number> <number>10</number>
...@@ -634,12 +637,6 @@ QWidget { ...@@ -634,12 +637,6 @@ QWidget {
<property name="uniformItemSizes"> <property name="uniformItemSizes">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="currentRow">
<number>-1</number>
</property>
<property name="widgetResizable" stdset="0">
<bool>true</bool>
</property>
</widget> </widget>
</item> </item>
</layout> </layout>
......
#include "itemdelegate.h"
#include "coupon.h"
#include <QPainter>
#include <QStyleOptionViewItem>
#include <QModelIndex>
#include <QApplication>
#include <QDebug>
ItemDelegate::ItemDelegate(QWidget *parent) :
QStyledItemDelegate(parent)
{
}
void ItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
if(index.data().canConvert<Coupon>()) {
Coupon coupon = qvariant_cast<Coupon>(index.data());
QRect rect = QRect(option.rect.x(), option.rect.y(), option.rect.width(), option.rect.height());
coupon.paint(painter, rect, option.palette);
if (option.state & QStyle::State_Selected) {
painter->drawImage(option.rect, QImage(":/coupon_select.png"));
}
} else {
QStyledItemDelegate::paint(painter, option, index);
}
}
QSize ItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
if(index.data().canConvert<Coupon>()) {
Coupon coupon = qvariant_cast<Coupon>(index.data());
return coupon.sizeHint();
} else {
return QStyledItemDelegate::sizeHint(option, index);
}
}
#ifndef ITEMDELEGATE_H
#define ITEMDELEGATE_H
#include <QStyledItemDelegate>
class ItemDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
ItemDelegate(QWidget *parent = 0);
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override;
};
#endif // ITEMDELEGATE_H
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment