用到的关系图标如下
源码下载链接:
download.csdn.net/download/we…
代码如下:
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTableWidget>
#include <QHeaderView>
#include <QTableWidgetItem>
#include <QDebug>
#include <QLabel>
struct T_Param
{
QRect rect;
bool bHasParent;
int nParantToolID;
bool bHasChild;
QVector<int> vChildToolID;
T_Param()
{
bHasParent = false;
bHasChild = false;
}
};
struct T_InData
{
T_Param tParam[2];
};
struct T_OutData
{
T_Param tParam[2];
};
struct T_Tool
{
T_InData tInData;
T_OutData tOutData;
};
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
QTableWidget *m_tablewidget;
QLabel *m_labelRelation[6];
QPixmap m_qPixmap[6];
T_Tool AlgoTool[5];//假设一共5个算子
int GetRelationPicID(int nCurrentRow,int nSelectedRow);
void GetToolChildID(int nToolID,QVector<int> &vChildToolID);
bool HasTargetChildIDBeforeCrtID(int nOriginToolID, int nTargetToolID);
bool HasTargetChildID(int nOriginToolID,int nTargetToolID);
bool HasChildID(int nOriginToolID);
void GetToolParentID(int nToolID,QVector<int> &vParentToolID);
bool HasTargetParentIDAfterCrtID(int nOriginToolID, int nTargetToolID);
bool HasTargetParentID(int nOriginToolID,int nTargetToolID);
bool HasParentID(int nOriginToolID);
void ResetTableWidget();
public slots:
// void TableDoubleClicked(QTableWidgetItem* item,int n);
void CellDoubleClicked(int nRow,int nColumn);
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QHBoxLayout>
#include <QRect>
#include <QVector>
#include <QMap>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
//设置算子参数关系
//第一个算子:
AlgoTool[0].tOutData.tParam[0].bHasChild = true;
AlgoTool[0].tOutData.tParam[0].vChildToolID.push_back(1);
AlgoTool[0].tOutData.tParam[0].vChildToolID.push_back(2);
AlgoTool[0].tOutData.tParam[1].bHasChild = true;
AlgoTool[0].tOutData.tParam[1].vChildToolID.push_back(3);
AlgoTool[0].tOutData.tParam[1].vChildToolID.push_back(4);
//第二个算子
AlgoTool[1].tInData.tParam[0].bHasParent = true;
AlgoTool[1].tInData.tParam[0].nParantToolID = 0;
AlgoTool[1].tOutData.tParam[0].bHasChild = true;
AlgoTool[1].tOutData.tParam[0].vChildToolID.push_back(2);
//第三个算子
AlgoTool[2].tInData.tParam[0].bHasParent = true;
AlgoTool[2].tInData.tParam[0].nParantToolID = 0;
AlgoTool[2].tInData.tParam[1].bHasParent = true;
AlgoTool[2].tInData.tParam[1].nParantToolID = 1;
AlgoTool[2].tOutData.tParam[0].bHasChild = true;
AlgoTool[2].tOutData.tParam[0].vChildToolID.push_back(3);
AlgoTool[2].tOutData.tParam[1].bHasChild = true;
AlgoTool[2].tOutData.tParam[1].vChildToolID.push_back(4);
//第四个算子
AlgoTool[3].tInData.tParam[0].bHasParent = true;
AlgoTool[3].tInData.tParam[0].nParantToolID = 0;
AlgoTool[3].tInData.tParam[1].bHasParent = true;
AlgoTool[3].tInData.tParam[1].nParantToolID = 2;
//第五个算子
AlgoTool[4].tInData.tParam[0].bHasParent = true;
AlgoTool[4].tInData.tParam[0].nParantToolID = 0;
AlgoTool[4].tInData.tParam[1].bHasParent = true;
AlgoTool[4].tInData.tParam[1].nParantToolID = 2;
ui->setupUi(this);
m_tablewidget = new QTableWidget(this);
//设置背景成交替色
m_tablewidget->setAlternatingRowColors(true);
//设置列数
m_tablewidget->setColumnCount(2);
//设置初始行数
m_tablewidget->setRowCount(6);
//设置垂直表头不可见
m_tablewidget->verticalHeader()->setVisible(false);
//设置显示网格线
m_tablewidget->setShowGrid(false);
//设置table_log表头
QStringList header;
header<<tr("Relation")<<tr("ToolName");
m_tablewidget->setHorizontalHeaderLabels(header);
//设置表头背景和文字颜色
m_tablewidget->horizontalHeader()->setStyleSheet("QHeaderView::section {background-color: rgb(16,45,63);color: white;}");//第一个颜色是背景色,第二个颜色是字颜色
//设置列宽自适应当前控件大小
// m_tablewidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
// m_tablewidget->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
//设置表格内数据无法编辑
m_tablewidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
//初始化m_qPixmap
m_qPixmap[0].load(":/pics/0pass");
m_qPixmap[1].load(":/pics/1out");
m_qPixmap[2].load(":/pics/2in");
m_qPixmap[3].load(":/pics/3in_out");
m_qPixmap[4].load(":/pics/4pass_out");
m_qPixmap[5].load(":/pics/5pass_in");
//绑定图片与label
m_labelRelation[0] = new QLabel();
m_labelRelation[0]->setPixmap(m_qPixmap[0]);
m_labelRelation[1] = new QLabel();
m_labelRelation[1]->setPixmap(m_qPixmap[1]);
m_labelRelation[2] = new QLabel();
m_labelRelation[2]->setPixmap(m_qPixmap[2]);
m_labelRelation[3] = new QLabel();
m_labelRelation[3]->setPixmap(m_qPixmap[3]);
m_labelRelation[4] = new QLabel();
m_labelRelation[4]->setPixmap(m_qPixmap[4]);
m_labelRelation[5] = new QLabel();
m_labelRelation[5]->setPixmap(m_qPixmap[5]);
//将label放入tablewidget
m_tablewidget->setCellWidget(0,0,m_labelRelation[1]);
m_tablewidget->setCellWidget(1,0,m_labelRelation[4]);
m_tablewidget->setCellWidget(2,0,m_labelRelation[3]);
m_tablewidget->setCellWidget(3,0,m_labelRelation[0]);
m_tablewidget->setCellWidget(4,0,m_labelRelation[5]);
m_tablewidget->setCellWidget(5,0,m_labelRelation[2]);
QTableWidgetItem *tableItem[6];
for(int i = 0 ;i<6;i++)
{
tableItem[i] = new QTableWidgetItem();
}
tableItem[0]->setText("Tool1");
m_tablewidget->setItem(0,1,tableItem[0]);
tableItem[1]->setText("Tool2");
m_tablewidget->setItem(1,1,tableItem[1]);
tableItem[2]->setText("Tool3");
m_tablewidget->setItem(2,1,tableItem[2]);
tableItem[3]->setText("Tool4");
m_tablewidget->setItem(3,1,tableItem[3]);
tableItem[4]->setText("Tool5");
m_tablewidget->setItem(4,1,tableItem[4]);
tableItem[5]->setText("Tool6");
m_tablewidget->setItem(5,1,tableItem[5]);
//设置每行高度
for(int i = 0;i<6;i++)
{
m_tablewidget->setRowHeight(i,64);
}
//设置第一列宽
m_tablewidget->setColumnWidth(0,64);
//设置垂直布局
QHBoxLayout* m_HboxLayout = new QHBoxLayout(this);
this->centralWidget()->setLayout(m_HboxLayout);
m_HboxLayout->addWidget(m_tablewidget);
//绑定双击表格对象的信号槽
connect(m_tablewidget,SIGNAL(cellDoubleClicked(int,int)),this,SLOT(CellDoubleClicked(int,int)));
//connect(m_tablewidget,SIGNAL(itemDoubleClicked(QTableWidgetItem*,int)),this,SLOT(TableDoubleClicked(QTableWidgetItem*,int)));
}
MainWindow::~MainWindow()
{
delete ui;
}
int MainWindow::GetRelationPicID(int nCurrentRow,int nSelectedRow)
{
if(nCurrentRow < nSelectedRow)
{
if(HasTargetChildID(nCurrentRow,nSelectedRow))//AlgoTool[nCurrentRow]中有输出参数给AlgoTool[nSelectedRow]
{
if(nCurrentRow == 0)
{
return 1;
}
else
{
if(HasTargetChildIDBeforeCrtID(nCurrentRow,nSelectedRow))//ID为 [0 ~ (nCurrentRow-1)] 的算子工具有输出参数给AlgoTool[nSelectedRow]
{
return 4;
}
else
{
return 1;
}
}
}
else
{
if(nCurrentRow == 0)
{
return -1;
}
else
{
if(HasTargetChildIDBeforeCrtID(nCurrentRow,nSelectedRow))//ID为 0 ~ (nCurrentRow-1) 的算子工具有输出参数给AlgoTool[nSelectedRow]
{
return 0;
}
else
{
return -1;//不需要插入图片
}
}
}
}
else if(nCurrentRow == nSelectedRow)
{
if(HasParentID(nCurrentRow))//AlgoTool[nCurrentRow]中有输入参数来自别的算子
{
if(HasChildID(nCurrentRow))//AlgoTool[nCurrentRow]中有输出参数给别的算子
{
return 3;
}
else
{
return 2;
}
}
else
{
if(HasChildID(nCurrentRow))//AlgoTool[nCurrentRow]中有输出参数给别的算子
{
return 1;
}
else
{
return -1;
}
}
}
else//nCurrentRow>nSelectedRow
{
if(HasTargetParentID(nCurrentRow,nSelectedRow))//AlgoTool[nCurrentRow]中有输入参数来自AlgoTool[nSelectedRow]
{
if(nCurrentRow == 4)
{
return 2;
}
else
{
if(HasTargetParentIDAfterCrtID(nCurrentRow,nSelectedRow))//ID为 [nCurrentRow+1 ~ 4] 的算子工具有输入参数来自AlgoTool[nSelectedRow]
{
return 5;
}
else
{
return 2;
}
}
}
else
{
if(nCurrentRow == 4)
{
return -1;
}
else
{
if(HasTargetParentIDAfterCrtID(nCurrentRow,nSelectedRow))//ID为 [nCurrentRow+1 ~ 4] 的算子工具有输入参数来自AlgoTool[nSelectedRow]
{
return 0;
}
else
{
return -1;
}
}
}
}
}
//获取所有使用 AlgoTool[nToolID]中输出参数 的算子ID
void MainWindow::GetToolChildID(int nToolID,QVector<int> &vChildToolID)
{
for(int i = 0;i<2;i++)
{
if(AlgoTool[nToolID].tOutData.tParam[i].bHasChild)
{
QVector<int> vTemp = AlgoTool[nToolID].tOutData.tParam[i].vChildToolID;
for(int j = 0;j<vTemp.size();j++)
{
vChildToolID.push_back(vTemp.at(j));
}
}
}
}
//ID为 [0 ~ (nCurrentRow-1)] 的算子工具有输出参数给AlgoTool[nSelectedRow],则返回true
bool MainWindow::HasTargetChildIDBeforeCrtID(int nOriginToolID, int nTargetToolID)
{
bool bRet = false;
if(nOriginToolID<1)
{
return false;
}
for(int i = 0;i<nOriginToolID;i++)
{
if(HasTargetChildID(i,nTargetToolID))
{
bRet = true;
}
}
return bRet;
}
//AlgoTool[nOriginToolID]中有输出参数给AlgoTool[nTargetToolID],则return true;
bool MainWindow::HasTargetChildID(int nOriginToolID, int nTargetToolID)
{
bool bRet = false;
QVector<int> vChildToolID;
vChildToolID.resize(0);
GetToolChildID(nOriginToolID,vChildToolID);
for(int i = 0;i<vChildToolID.size();i++)
{
if(vChildToolID.at(i) == nTargetToolID)
{
bRet = true;
}
}
return bRet;
}
//判断AlgoTool[nOriginToolID] 是否有输出参数给别的算子
bool MainWindow::HasChildID(int nOriginToolID)
{
QVector<int> vChildToolID;
vChildToolID.resize(0);
GetToolChildID(nOriginToolID,vChildToolID);
if(vChildToolID.isEmpty())
{
return false;
}
else
{
return true;
}
}
//获取所有 AlgoTool[nToolID]中输入参数 的源算子ID
void MainWindow::GetToolParentID(int nToolID,QVector<int> &vParentToolID)
{
for(int i = 0;i<2;i++)
{
if(AlgoTool[nToolID].tInData.tParam[i].bHasParent)
{
vParentToolID.push_back(AlgoTool[nToolID].tInData.tParam[i].nParantToolID);
}
}
}
//ID为 [nCurrentRow+1 ~ 4] 的算子工具有输入参数来自AlgoTool[nSelectedRow]
bool MainWindow::HasTargetParentIDAfterCrtID(int nOriginToolID, int nTargetToolID)
{
bool bRet = false;
if((nOriginToolID > 4)||(nOriginToolID == 4))
{
return false;
}
for(int i = nOriginToolID+1;i<5;i++)
{
if(HasTargetParentID(i,nTargetToolID))
{
bRet = true;
}
}
return bRet;
}
//AlgoTool[nOriginToolID]中有输入参数来自AlgoTool[nTargetToolID],则return true;
bool MainWindow::HasTargetParentID(int nOriginToolID, int nTargetToolID)
{
bool bRet = false;
QVector<int> vParentToolID;
vParentToolID.resize(0);
GetToolParentID(nOriginToolID,vParentToolID);
for(int i = 0;i<vParentToolID.size();i++)
{
if(vParentToolID.at(i) == nTargetToolID)
{
bRet = true;
}
}
return bRet;
}
bool MainWindow::HasParentID(int nOriginToolID)
{
QVector<int> vParentToolID;
vParentToolID.resize(0);
GetToolParentID(nOriginToolID,vParentToolID);
if(vParentToolID.isEmpty())
{
return false;
}
else
{
return true;
}
}
void MainWindow::ResetTableWidget()
{
m_tablewidget->clear();
m_labelRelation[0] = new QLabel();
m_labelRelation[0]->setPixmap(m_qPixmap[0]);
m_labelRelation[1] = new QLabel();
m_labelRelation[1]->setPixmap(m_qPixmap[1]);
m_labelRelation[2] = new QLabel();
m_labelRelation[2]->setPixmap(m_qPixmap[2]);
m_labelRelation[3] = new QLabel();
m_labelRelation[3]->setPixmap(m_qPixmap[3]);
m_labelRelation[4] = new QLabel();
m_labelRelation[4]->setPixmap(m_qPixmap[4]);
m_labelRelation[5] = new QLabel();
m_labelRelation[5]->setPixmap(m_qPixmap[5]);
QTableWidgetItem *tableItem[6];
for(int i = 0 ;i<6;i++)
{
tableItem[i] = new QTableWidgetItem();
}
tableItem[0]->setText("Tool1");
m_tablewidget->setItem(0,1,tableItem[0]);
tableItem[1]->setText("Tool2");
m_tablewidget->setItem(1,1,tableItem[1]);
tableItem[2]->setText("Tool3");
m_tablewidget->setItem(2,1,tableItem[2]);
tableItem[3]->setText("Tool4");
m_tablewidget->setItem(3,1,tableItem[3]);
tableItem[4]->setText("Tool5");
m_tablewidget->setItem(4,1,tableItem[4]);
tableItem[5]->setText("Tool6");
m_tablewidget->setItem(5,1,tableItem[5]);
//设置table_log表头
QStringList header;
header<<tr("Relation")<<tr("ToolName");
m_tablewidget->setHorizontalHeaderLabels(header);
}
void MainWindow::CellDoubleClicked(int nRow, int nColumn)
{
ResetTableWidget();
for(int i = 0;i<5;i++)
{
int nPicID = GetRelationPicID(i,nRow);
if(nPicID != -1)
{
QLabel *label= new QLabel();
label->setPixmap(m_qPixmap[nPicID]);
m_tablewidget->setCellWidget(i,0,label);
}
}
}