用qtablewidget表示算子输入输出关系

152 阅读4分钟

在这里插入图片描述
用到的关系图标如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
源码下载链接:
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);
        }
    }
}