#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QStandardItemModel>
#include <QDebug>
#include <QMenu>
#include <QSqlDatabase>
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_sql = new My_Sql();
m_sql->initsql();
m_sql->getAllTreeNodes(m_vNodes);
QStandardItemModel* model = new QStandardItemModel(ui->treeView);
model->setHorizontalHeaderLabels(QStringList()<<QStringLiteral("VFT任务分解结构"));
QStandardItem* itemProject = new QStandardItem(QStringLiteral("任务1"));
QString whatsThis = QString("1");
itemProject->setWhatsThis(whatsThis);
model->appendRow(itemProject);
//将所有的节点循环添加到树上
add_son_to_tree(itemProject,1);
ui->treeView->setContextMenuPolicy(Qt::CustomContextMenu);
ui->treeView->setModel(model);
//添加节点
m_addNodeInfo = new DialogAddNodeInfo();
}
void MainWindow::add_son_to_tree(QStandardItem* itemProject,int parent_id)
{
//如果孩子节点为空,则返回
QVector<treeNode> vNodesID;
m_sql->queryChildNodesById(parent_id,vNodesID);
if(vNodesID.size() == 0)
return;
//查找孩子节点,并添加到树中
for(int i=0;i<vNodesID.size();i++)
{
QStandardItem* itemChild = new QStandardItem(vNodesID[i].name);
itemProject->appendRow(itemChild);
QString whatsThis = QString("%1").arg(vNodesID[i].id);
itemChild->setWhatsThis(whatsThis);
//对查找到的孩子节点,调用递归算法,添加到树中
add_son_to_tree(itemChild,vNodesID[i].id);
}
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_treeView_viewportEntered()
{
qDebug()<<"on_treeView_viewportEntered";
}
//void MainWindow::on_treeView_clicked(const QModelIndex &index)
//{
// QStandardItemModel* model = static_cast<QStandardItemModel*>(ui->treeView->model());
// QStandardItem* currentItem = model->itemFromIndex(index);
//// QString str;
//// str += QStringLiteral("当前选中:%1\nrow:%2,column:%3\n").arg(index.data().toString()).arg(index.row()).arg(index.column());
//// str += QStringLiteral("父级:%1,row:%2,index.internalId()=%3\n").arg(index.parent().data().toString()).arg(index.parent().row()).arg(index.internalId());
//// qDebug()<<(str);
// qDebug()<<"whatThis="<<currentItem->whatsThis();
//}
void MainWindow::on_treeView_customContextMenuRequested(const QPoint &pos)
{
qDebug()<<"on_treeView_customContextMenuRequested";
QModelIndex index=ui->treeView->currentIndex();
QString fileName=ui->treeView->model()->data(index).toString();
QMenu *menu=new QMenu();
menu->addAction(QString(tr("%1-添加子任务").arg(fileName)),this,SLOT(slotTestAddSon()));
menu->addAction(QString(tr("%1-添加同级任务").arg(fileName)),this,SLOT(slotTest3()));
menu->addAction(QString(tr("%1-删除任务").arg(fileName)),this,SLOT(slotTest2()));
menu->exec(QCursor::pos());
}
void MainWindow::slotTest2()
{
qDebug()<<"删除任务";
QStandardItemModel* model = static_cast<QStandardItemModel*>(ui->treeView->model());
QModelIndex currentIndex = ui->treeView->currentIndex();
QStandardItem* currentItem = model->itemFromIndex(currentIndex);
if(currentItem->parent() == nullptr)
{
model->removeRow(currentIndex.row());
return;
}
qDebug()<<"del current id ="<<currentItem->whatsThis();
//先把数据从数组和数据库表中删除,然后再删除节点
int nodeID = currentItem->whatsThis().toInt();
m_sql->delTreeNodeById(nodeID);
for(auto node=m_vNodes.begin();node < m_vNodes.end();node++)
{
if(node->id == nodeID)
{
m_vNodes.erase(node);
}
}
model->removeRow(currentIndex.row(),currentItem->parent()->index());
}
void MainWindow::slotTestAddSon()
{
qDebug()<<"添加子任务";
QString name = QString("");
if(m_addNodeInfo->exec() == QDialog::Accepted)
{
qDebug()<<"name = "<<m_addNodeInfo->GetName();
name = m_addNodeInfo->GetName();
if(!m_addNodeInfo->GetName().isEmpty())
{
QStandardItem* itemChild = new QStandardItem(name);
uint id = generateNewID(m_vNodes);
QString whatsThis = QString("%1").arg(id);
itemChild->setWhatsThis(whatsThis);
QStandardItemModel* model = static_cast<QStandardItemModel*>(ui->treeView->model());
QModelIndex currentIndex = ui->treeView->currentIndex();
QStandardItem* currentItem = model->itemFromIndex(currentIndex);
currentItem->appendRow(itemChild);
////
treeNode data;
data.id = id;
data.name = name;
data.order_no = itemChild->row();
data.parent_id = currentItem->whatsThis().toInt();
qDebug()<<"parent_id="<<currentItem->whatsThis();
m_vNodes.push_back(data);
m_sql->addTreeNode(data);
}
}
}
//添加同级任务
void MainWindow::slotTest3()
{
qDebug()<<"添加同级任务";
QString name = QString("");
if(m_addNodeInfo->exec() == QDialog::Accepted)
{
qDebug()<<"name = "<<m_addNodeInfo->GetName();
name = m_addNodeInfo->GetName();
if(!m_addNodeInfo->GetName().isEmpty())
{
QStandardItem* itemChild = new QStandardItem(name);
QStandardItemModel* model = static_cast<QStandardItemModel*>(ui->treeView->model());
QModelIndex currentIndex = ui->treeView->currentIndex();
QStandardItem* currentItem = model->itemFromIndex(currentIndex);
uint id = generateNewID(m_vNodes);
QString whatsThis = QString("%1").arg(id);
treeNode data;
if(currentItem->parent()==nullptr)
{
qDebug()<<"当前为顶级节点";
QStandardItem* itemProject = new QStandardItem(name);
itemProject->setWhatsThis(whatsThis);
data.id = id;
data.name = name;
data.order_no = itemProject->row();
data.parent_id = 0;
model->appendRow(itemProject);
}
else
{
currentItem->parent()->appendRow(itemChild);
itemChild->setWhatsThis(whatsThis);
qDebug()<< "whatsThis="<<whatsThis;
data.id = id;
data.name = name;
data.order_no = currentItem->row();
data.parent_id = currentItem->parent()->whatsThis().toInt();
qDebug()<<"parent_id="<<currentItem->parent()->whatsThis();
}
//增加到数组中
m_vNodes.push_back(data);
//添加到数据库表中
m_sql->addTreeNode(data);
}
}
}
int MainWindow::generateNewID(QVector<treeNode> m_vNodes) const
{
int id = 0;
QRandomGenerator *rand= new QRandomGenerator();
while(true)
{
id = rand->bounded(100000);
bool hasSameID = false;
for(auto node=m_vNodes.begin();node != m_vNodes.end();node++)
{
if(node->id == id)
{
hasSameID = true;
break;
}
}
if(!hasSameID)
{
break;
}
}
return id;
}