Qt中QTreeWidget根据数据库(QTableWidget)内容动态构建目录

一.前言

这篇博文的内容是我在看了CSDN博主:姓值钱的金三岁 的博文《Qt中QTreeWidget根据数据库内容动态构建目录》写出来的,但是我为了达到演示的效果,是用QTableWidget来模拟数据库的,如果是用sqlite数据库,应该要比TableWidget更简单一点,但原理是相同的。

二.效果图

先上效果图:在这里插入图片描述
基本逻辑和伪代码可以去原博主哪里看一下再回来,我这里只上源码。
链接: 《Qt中QTreeWidget根据数据库内容动态构建目录》.

三.代码部分

新建项目用的是Qt Widget Application, 基类选择的是带ui界面的Widget,首先在ui界面中拖入一个QTreeWidget和一个TableWidget,QtreeWidget改下列名就可以了,然后在tableWidget中把内容信息填好。在这里插入图片描述
widget.h

#define WIDGET_H

#include <QWidget>
#include <QDebug>
#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QList>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
    //枚举类型,表示列号
    enum    tableColNum{colItem0=0, colItem1=1,colItem2=2};
    void initTree();
    void departTree(int row,QTreeWidgetItem* item);
    QList<QTableWidgetItem*> findItem(QString& , int);
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //首先要给taleWidget没有内容的Item new一个空间,不然访问它就是非法的(段错误)
    QTableWidgetItem* item = new QTableWidgetItem;
    ui->tableWidget->setItem(0,2,item);
    item = new QTableWidgetItem;
    ui->tableWidget->setItem(1,2,item);
    initTree();
    ui->treeWidget->expandAll();
}

Widget::~Widget()
{
    delete ui;
}

void Widget::initTree()
{
    QList<QTableWidgetItem*> list;
    QString str = "";
    list = findItem(str,colItem2);
    int row;
    QString DEPART_NAME;
    if(!list.isEmpty()){
        for(int i = 0; i < list.size(); ++i){
            row = list.at(i)->row();
            DEPART_NAME = ui->tableWidget->item(row,colItem1)->text();
            QTreeWidgetItem* item = new QTreeWidgetItem(ui->treeWidget,QStringList(DEPART_NAME));
            ui->treeWidget->addTopLevelItem(item);
            departTree(row,item);
        }
    }
}

void Widget::departTree(int fatherRow, QTreeWidgetItem *item)
{
    //传进来的是treeWidget的父节点,和他的信息所对应的行号
    //根据父节点colItem0行的部门名称(DEPART_NAME),去表中搜索他的小弟:
    //上级部门ID(DEPART_UPPER_DEPT)
    QList<QTableWidgetItem*> list;
    QString DEPART_ID = ui->tableWidget->item(fatherRow,colItem0)->text();
    list = findItem(DEPART_ID,colItem2);
    int sonRow;
    QString DEPART_NAME;
    if(!list.isEmpty()){
        for(int i = 0; i < list.size();++i){
            sonRow = list.at(i)->row();
            DEPART_NAME = ui->tableWidget->item(sonRow,colItem1)->text();
            QTreeWidgetItem* newitem = new QTreeWidgetItem(item,QStringList(DEPART_NAME));
            item->addChild(newitem);
            departTree(sonRow,newitem);
        }
    }
}

QList<QTableWidgetItem*> Widget::findItem(QString& target,int column)
{
    QList<QTableWidgetItem*> list;
    QString str;
    int row = ui->tableWidget->rowCount();
    int col = ui->tableWidget->columnCount();
    for(int i = 0; i < row; ++i){
        for(int j = 0; j < col;++j ){
            if(j != column) continue;
            str = ui->tableWidget->item(i,j)->text();
            if(target == str){
                list.push_back(ui->tableWidget->item(i,j));
            }
        }
    }
    return list;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值