• QT学习篇: 入门(二)


    库存订单界面:
    (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();
    }
    

    效果图

  • 相关阅读:
    利用存储过程生成随机数,并用其它存储过程调用此过程
    dataGridView中的数据操作
    listView绑定数据
    我的简易 数据存取器 的封装
    dataGridView 控件的简单绑定
    文件写入写出的封装
    Button1.Attributes.Add()方法小结
    自定义分页栏
    安迪的找工作日志——9.12笔试(优酷土豆)问题及解答
    安迪的找工作日志——9.13在教四四楼墙上看到的
  • 原文地址:https://www.cnblogs.com/stardujie89/p/4614379.html
Copyright © 2020-2023  润新知