一.前言
这篇博文的内容是我在看了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;
}