库存订单界面:

(1)包括序号、订单代码、订单名称、产品代码、产品类型、计划加工数量、最晚完工日期。

(2)model增加临时map,用于存储库存订单。

(3)后台计算完成后,会将库存订单推送给前台,弹出该界面,若是人工确认的话,则用户可以在该界面进行编辑,确认后进行插单排程;若是自动的话,则自动进行插单排程。

(4)插单排程成功后,“制造订单表”中以“客户关系”来区别哪些订单是库存订单,“客户关系”是工厂本身自己的都是库存订单。

头文件:

#ifndef _CSTOCKORDERSET_H
#define _CSTOCKORDERSET_H #include "ui_CStockOrderSet.h"
#include "QtGui/QDialog"
#include "QtGui/QStandardItemModel" #include <QTableView>
//#include <QGroupBox>
#include <QDateTime>
#include <QAction> typedef struct StockOrder
{
int index; //序号
QString strOrderCode; //订单代码
QString strOrderName; //订单名称
QString strGoodsCode; //产品代码
QString strGoodsType; //产品类型
double dbPlanNum; //计划加工数量
QDateTime tLaterestTime; //最晚完工日期, 格式:yyyy-MM-dd HH:mm:ss
int iProjectID; //产品序列号
}StockOrder_t; class CTableStockOrder : public QDialog
{
Q_OBJECT
public:
CTableStockOrder(QWidget *parent = 0, Qt::WFlags flags = 0);
~CTableStockOrder();
private:
void initLayout();
void setDelegate();
void setItemData();
void insertBlankEntry();
public:
void setData(const QMap<int, StockOrder_t>& orderMode);
QMap<int, StockOrder_t> getData();
private:
Ui::StockOrder_Dialog ui;
QStandardItemModel* StockOrder_Model;
QMap<int, StockOrder_t> m_orderMode;
int m_iInsertIndex;
int m_iBlankID;
int m_iMaxKey; QTableView* m_pOrderTableView;
bool m_pFlag; //判断单元格数据是否被修改,第一次加载的数据不算修改
bool m_isAutoMation; //判断是人工确认还是自动,人工确认-false 自动-true QAction* m_pActionCopy;
QAction* m_pActionInsert;
QAction* m_pActionRemove; QMap<int, StockOrder_t> m_mapClipboard; private slots:
void OnItemChanged(QStandardItem* item);
void OnCustomContextMenuRequested(const QPoint &pos); void OnInsertEntry();
void OnCopyEntry();
void OnRemoveEntry(); void OnOk();
void OnCancel();
};
#endif

源cpp文件

#include "CTableStockOrder.h"
#include "QtGui/QGridLayout" #include <QModelIndex>
#include <QMenu>
#include <QItemSelectionModel>
#include <QPushButton> const int OrderColumnCount = 8;
CTableStockOrder::CTableStockOrder(QWidget *parent, Qt::WFlags flags)
:QDialog(parent, flags),
m_pFlag(false),
m_isAutoMation(false),
m_iBlankID(0),
m_iInsertIndex(0),
m_iMaxKey(1)
{
ui.setupUi(this);
m_pOrderTableView = ui.ordertableView; setWindowTitle(tr("库存订单界面"));
setFixedSize(800, 650);
initLayout();
setData(m_orderMode);
} CTableStockOrder::~CTableStockOrder()
{
} void CTableStockOrder::initLayout()
{
ui.okButton->setText(tr("确定"));
ui.cancelButton->setText(tr("取消")); connect(ui.okButton, SIGNAL(clicked()), this, SLOT(OnOk()));
connect(ui.cancelButton, SIGNAL(clicked()), this, SLOT(OnCancel())); QString strProperty[OrderColumnCount] =
{
tr("序号"),tr("订单代码"),tr("订单名称"), tr("产品代码"), tr("产品类型"),
tr("计划加工数量"), tr("最晚完工日期"), tr("产品序号")
}; StockOrder_Model = new QStandardItemModel(this);
StockOrder_Model->setColumnCount(OrderColumnCount);
for (int i = 0; i < OrderColumnCount; i++)
{
StockOrder_Model->setHeaderData(i, Qt::Horizontal, strProperty[i]);
}
connect(StockOrder_Model, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(OnItemChanged(QStandardItem* item))); m_pOrderTableView->setModel(StockOrder_Model);
m_pOrderTableView->setSortingEnabled(true);
m_pOrderTableView->resizeColumnsToContents();
m_pOrderTableView->verticalHeader()->setResizeMode(QHeaderView::Fixed);
m_pOrderTableView->setAlternatingRowColors(true);
m_pOrderTableView->verticalHeader()->setDefaultSectionSize(25); if (m_isAutoMation)
{
m_pOrderTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
}
else
{
QHeaderView* pVHeaderView = m_pOrderTableView->verticalHeader();
pVHeaderView->setContextMenuPolicy(Qt::CustomContextMenu);
connect(pVHeaderView, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(OnCustomContextMenuRequested(const QPoint&))); m_pActionCopy = new QAction(tr("复制"), this);
m_pActionCopy->setEnabled(false);
connect(m_pActionCopy, SIGNAL(triggered()), this, SLOT(OnCopyEntry())); m_pActionInsert = new QAction(tr("插入"), this);
m_pActionInsert->setEnabled(false);
connect(m_pActionInsert, SIGNAL(triggered()), this, SLOT(OnInsertEntry())); m_pActionRemove = new QAction(tr("删除"), this);
m_pActionRemove->setEnabled(false);
connect(m_pActionRemove, SIGNAL(triggered()), this, SLOT(OnRemoveEntry()));
}
} void CTableStockOrder::setData(const QMap<int, StockOrder_t>& orderMode)
{
m_orderMode = orderMode; QDateTime time = QDateTime::currentDateTime();//获取系统现在的时间
QString tLaterestTime = time.toString("yyyy-MM-dd hh:mm:ss ddd"); //设置显示格式
StockOrder_t item;
item.index = 1;
item.strOrderCode = tr("O01");
item.strOrderName = tr("P01");
item.strGoodsCode = "APS01";
item.strGoodsType = "TY01";
item.dbPlanNum = 1000;
item.tLaterestTime = QDateTime::fromString(tr("2015-06-23 10:19:05"), tr("yyyy-MM-dd HH:mm:ss"));
item.iProjectID = 10;
m_orderMode.insert(1, item); //对表格数据设置代理
setDelegate();
setItemData();
//插入空白行
insertBlankEntry();
} void CTableStockOrder::setDelegate()
{ } void CTableStockOrder::setItemData()
{
m_pFlag = false;
//清空表
StockOrder_Model->removeRows(0, StockOrder_Model->rowCount()); //重新插入
int iRow = 0; QMap<int, StockOrder_t>::const_iterator it;
for (it = m_orderMode.begin(); it != m_orderMode.end(); ++it)
{
StockOrder_Model->insertRows(iRow, 1, QModelIndex());
StockOrder_Model->setData(StockOrder_Model->index(iRow, 0), it->index);
StockOrder_Model->setData(StockOrder_Model->index(iRow, 1), it->strOrderCode);
StockOrder_Model->setData(StockOrder_Model->index(iRow, 2), it->strOrderName);
StockOrder_Model->setData(StockOrder_Model->index(iRow, 3), it->strGoodsCode);
StockOrder_Model->setData(StockOrder_Model->index(iRow, 4), it->strGoodsType);
StockOrder_Model->setData(StockOrder_Model->index(iRow, 5), it->dbPlanNum);
StockOrder_Model->setData(StockOrder_Model->index(iRow, 6), it->tLaterestTime);
StockOrder_Model->setData(StockOrder_Model->index(iRow, 7), it->iProjectID); iRow++;
}
m_pFlag = true;
} void CTableStockOrder::insertBlankEntry()
{
m_pFlag = false; int iRow = StockOrder_Model->rowCount();
StockOrder_Model->insertRows(iRow, 1, QModelIndex());
StockOrder_Model->setData(StockOrder_Model->index(iRow, 0), QString(""));
StockOrder_Model->setData(StockOrder_Model->index(iRow, 1), QString(""));
StockOrder_Model->setData(StockOrder_Model->index(iRow, 2), QString(""));
StockOrder_Model->setData(StockOrder_Model->index(iRow, 3), QString(""));
StockOrder_Model->setData(StockOrder_Model->index(iRow, 4), QString(""));
StockOrder_Model->setData(StockOrder_Model->index(iRow, 5), QString(""));
StockOrder_Model->setData(StockOrder_Model->index(iRow, 6), QVariant("").toDateTime());
StockOrder_Model->setData(StockOrder_Model->index(iRow, 7), QString(""));
m_pFlag = true;
} void CTableStockOrder::OnItemChanged(QStandardItem* item)
{
if (item == NULL || !m_pFlag)
{
return;
} int iRow = item->index().row();
int iColumn = item->index().column();
int iID = StockOrder_Model->data(StockOrder_Model->index(iRow, 0)).toInt();
if (iID == m_iBlankID)
{
QString strCode = StockOrder_Model->data(StockOrder_Model->index(iRow, 1)).toString();
if (!strCode.isEmpty())
{
StockOrder_t opt;
opt.index = m_iMaxKey;
opt.strOrderCode = StockOrder_Model->data(StockOrder_Model->index(iRow, 1)).toString();
opt.strOrderName = StockOrder_Model->data(StockOrder_Model->index(iRow, 2)).toString();
opt.strGoodsCode = StockOrder_Model->data(StockOrder_Model->index(iRow, 3)).toString();
opt.strGoodsType = StockOrder_Model->data(StockOrder_Model->index(iRow, 4)).toString();
opt.dbPlanNum = StockOrder_Model->data(StockOrder_Model->index(iRow, 5)).toDouble();
opt.tLaterestTime = StockOrder_Model->data(StockOrder_Model->index(iRow, 6)).toDateTime();
opt.iProjectID = StockOrder_Model->data(StockOrder_Model->index(iRow, 7)).toInt(); m_iMaxKey++;
insertBlankEntry();
}
} switch(iColumn)
{
case 0:
{
m_orderMode[iID].index = StockOrder_Model->data(StockOrder_Model->index(iRow, 0)).toInt();
break;
}
case 1:
{
m_orderMode[iID].strOrderCode = StockOrder_Model->data(StockOrder_Model->index(iRow, 1)).toString();
break;
}
case 2:
{
m_orderMode[iID].strOrderName = StockOrder_Model->data(StockOrder_Model->index(iRow, 2)).toString();
break;
}
case 3:
{
m_orderMode[iID].strGoodsCode = StockOrder_Model->data(StockOrder_Model->index(iRow, 3)).toString();
break;
}
case 4:
{
m_orderMode[iID].strGoodsType = StockOrder_Model->data(StockOrder_Model->index(iRow, 4)).toString();
break;
}
case 5:
{
m_orderMode[iID].dbPlanNum = StockOrder_Model->data(StockOrder_Model->index(iRow, 5)).toDouble();
break;
}
case 6:
{
m_orderMode[iID].tLaterestTime = StockOrder_Model->data(StockOrder_Model->index(iRow, 6)).toDateTime();
break;
}
case 7:
{
m_orderMode[iID].iProjectID = StockOrder_Model->data(StockOrder_Model->index(iRow, 7)).toInt();
break;
}
default:
break;
} } QMap<int, StockOrder_t> CTableStockOrder::getData()
{
return m_orderMode;
} void CTableStockOrder::OnCopyEntry()
{
QItemSelectionModel *selections = m_pOrderTableView->selectionModel();
QModelIndexList selectedIndex = selections->selectedRows();
m_mapClipboard.clear();
m_iInsertIndex = 0;
foreach (QModelIndex index, selectedIndex)
{
int iID = StockOrder_Model->data(StockOrder_Model->index(index.row(), 0)).toInt();
m_mapClipboard[iID] = m_orderMode[iID];
}
} void CTableStockOrder::OnInsertEntry()
{
QModelIndex currentIndex = m_pOrderTableView->currentIndex(); m_pFlag = false;
int iRow = currentIndex.row()+1;
QMap<int, StockOrder_t>::iterator it;
for (it = m_mapClipboard.begin(); it != m_mapClipboard.end(); it++)
{
StockOrder_Model->insertRows(iRow, 1, QModelIndex());
StockOrder_t opt = it.value();
opt.index = ++m_iMaxKey;
// sales.SetResID(QString("%1_%2").arg(it->GetMachineCode()).arg(m_iInsertIndex));
StockOrder_Model->setData(StockOrder_Model->index(iRow, 0), opt.index);
StockOrder_Model->setData(StockOrder_Model->index(iRow, 1), opt.strOrderCode);
StockOrder_Model->setData(StockOrder_Model->index(iRow, 2), opt.strOrderName);
StockOrder_Model->setData(StockOrder_Model->index(iRow, 3), opt.strGoodsCode);
StockOrder_Model->setData(StockOrder_Model->index(iRow, 4), opt.strGoodsType);
StockOrder_Model->setData(StockOrder_Model->index(iRow, 5), opt.dbPlanNum);
StockOrder_Model->setData(StockOrder_Model->index(iRow, 6), opt.tLaterestTime);
StockOrder_Model->setData(StockOrder_Model->index(iRow, 7), opt.iProjectID); //StockOrder_Model->item(iRow, 0)->setEditable(false); // ID不可修改
//StockOrder_Model->item(iRow, 5)->setEditable(false); // 方案ID不可修改 m_orderMode[opt.index] = opt;
iRow++;
}
m_iInsertIndex++;
m_pFlag = true;
} void CTableStockOrder::OnRemoveEntry()
{
QItemSelectionModel *selections = m_pOrderTableView->selectionModel();
QModelIndexList selectedIndex = selections->selectedRows();
QMap<int, int> mapRows; // 自动排序,方便表多行删除
foreach (QModelIndex index, selectedIndex)
{
int iID = StockOrder_Model->data(StockOrder_Model->index(index.row(), 0)).toInt();
m_orderMode.remove(iID);
mapRows[index.row()] = index.row();
} QList<int> lstRows;
QMap<int, int>::iterator it = mapRows.begin();
for (; it != mapRows.end(); it++)
{
lstRows.prepend(it.value());
} for (int i = 0; i < lstRows.size(); i++)
{
StockOrder_Model->removeRows(lstRows.at(i), 1);
}
} void CTableStockOrder::OnCustomContextMenuRequested(const QPoint &pos)
{
int iCurrentRow = m_pOrderTableView->verticalHeader()->logicalIndexAt(pos);
if(iCurrentRow == -1)
{
return;
} //空白行不弹出右键菜单
int iID = StockOrder_Model->data(StockOrder_Model->index(iCurrentRow, 0)).toUInt();
if (iID == m_iBlankID)
{
return;
} //获取选中行
QItemSelectionModel *selections = m_pOrderTableView->selectionModel();
QModelIndexList selectedIndex = selections->selectedRows();
if (!selectedIndex.isEmpty())
{
bool bSelected = false;
foreach (QModelIndex index, selectedIndex)
{
if (index.row() == iCurrentRow)
{
bSelected = true;
break;
}
}
if (!bSelected)
{
//选中行
m_pOrderTableView->selectRow(iCurrentRow);
}
//若空白行被选中,则取消选中
/*foreach (QModelIndex index, selectedIndex)
{
iID = StockOrder_Model->data(StockOrder_Model->index(index.row()).toInt();
if (iID == m_iBlankID)
{
selections->clearSelection();
break;
}
}*/ m_pActionCopy->setEnabled(true);
m_pActionRemove->setEnabled(true);
if (!m_mapClipboard.isEmpty())
{
m_pActionInsert->setEnabled(true);
}
else
{
m_pActionInsert->setEnabled(false);
}
}
else
{
m_pActionCopy->setEnabled(false);
m_pActionInsert->setEnabled(false);
m_pActionRemove->setEnabled(false);
} QMenu *menu = new QMenu;
menu->addAction(m_pActionCopy);
menu->addAction(m_pActionInsert);
menu->addAction(m_pActionRemove);
menu->exec(QCursor::pos());
} void CTableStockOrder::OnOk()
{
this->accept();
} void CTableStockOrder::OnCancel()
{
this->reject();
}

效果图

QT学习篇: 入门(二)的更多相关文章

  1. QT学习:入门篇(三)

    头文件: #ifndef CChatDisplaySet_h #define CChatDisplaySet_h #include "QtGui/QDialog" #include ...

  2. QT学习篇:入门(1)

    第一个为管理界面: (1)安全库存的设置,包括序号.物品代码.物品类型.最大库存量.最小库存量.最大库存比率.最小库存比率: (2)计算频率设置,包括:实时,定时(单位分为:分钟.小时.天),来自gl ...

  3. sass入门学习篇(二)

    从语法开始但是语法也不是一两句的事情,首先看基本的导入,使用 一,sass有两种后缀名文件:一种后缀名为sass,不使用大括号和分号:另一种就是我们这里使用的scss文件,建议scss. 二,导入 使 ...

  4. MFC/QT 学习笔记(二)——MFC入门

    MFC以C++形式封装了Windows API //实践 编写MFC需要的头文件#include <afxwin.h> 程序执行流程: 实例化应用程序对象(有且只有一个) 执行程序入口函数 ...

  5. python学习02python入门二

    学前须知:1.本文档有关内容均建立在python3.x版本上,python2.x已经成为历史,如有需要,文内会特别说明. 2.本文使用的编辑器多为架构在Windows上的pycharm,如需了解Lin ...

  6. xml学习篇(二) ----JSON 和XML对比

    在比较JSON和XML之前,我们先来上一堂关于数据格式的简要历史(更准确的说,是关于XML的始祖): 早在1970年,IBM开发了一种叫Generalized Markup Language的标记语言 ...

  7. docker学习篇(二)---- 基础篇

    引言 在之前的学习中,我知道了docker的三大组件分别是----镜像,容器,仓库.了解了这三个组件也就初步理解了docker.所以我学习了这三个组件,并记录下来. 镜像 docker在运行一个容器时 ...

  8. MFC学习篇(二):error LNK2005 及其解决方法

    环境:MFC条件下添加原有代码 >nafxcwd.lib(afxmem.obj) : error LNK2005: @YAPAXI@Z) already defined in LIBCMTD.l ...

  9. solr学习篇(二) solr 分词器篇

    关于solr7.4搭建与配置可以参考 solr7.4 安装配置篇  在这里我们探讨一下分词的配置 目录 关于分词 配置分词 验证成功 1.关于分词 1.分词是指将一个中文词语拆成若干个词,提供搜索引擎 ...

随机推荐

  1. mongodb 教程三

    mongodb 实际上是保存json的数据的结构.当查询 是修改时 key 是可以用''保存. mongodb  插入语句 db.weixin.insert({name:'zhangfeng',age ...

  2. lucene拼写检查模块

    Lucene是Apache发布的开源搜索引擎开发工具包,不仅提供了核心的搜索功能,还提供了许多其他功能插件,例如:拼写检查功能模块. 搜索拼写检查模块实现类在lucene-suggest-x.xx.x ...

  3. 读取word文件.选择了TextParse

    待续! 代码还没分离出来.. 分离后会上传上来 不支持wps 文件 . ]]>

  4. About Technology Research

    做了大量的了解(research).尝试(experimental).探索(exploration).摸索(groping); 解决方案的选择时,要做前期的调研和Demo尝试. 对各方面的技术都做了一 ...

  5. 线程通信机制:共享内存 VS 消息传递

    在并发编程中,我们必须考虑的问题时如何在两个线程间进行通讯.这里的通讯指的是不同的线程之间如何交换信息. 目前有两种方式: 1.共享内存 2.消息传递(actor 模型) 共享内存: 共享内存这种方式 ...

  6. G - Arctic Network - poj2349

    在北极圈有一些基地,这些基地需要建立通讯网络,他们可以通过卫星直接通信或者无线通信,基地有S个卫星,N个基地,不过无线通信的传输距离是D,距离越远费用越高,现在想知道D最小是多少. 分析:使用krus ...

  7. java集合简介

    java集合主要包括以下几点 Java 集合概述 Collection 接口 Iterator 接口 Set List Map Collections 工具类 Enumeration 1.java集合 ...

  8. CSS里的 no-repeat 是什么意思

    CSS里的 no-repeat是针对背景图片来说的.当你设置了no-repeat这个属性后,你的背景图片将不会被重复,再换一种说法,你在网站上所看到的背景图片就是你所添加的图片, 不会出现平铺或者重复 ...

  9. Oracle执行计划——all_rows和first_rows(n) 优化器模式

    0. 环境创建 SQL> create usertest identified by test 2 default tablespace users 3 temporary tablespace ...

  10. ZOJ1221 && UVA567:Risk(Floyd)

    Risk is a board game in which several opposing players attempt to conquer the world. The gameboard c ...