TreeWidget 目录树组件,该组件适用于创建和管理目录树结构,在开发中我们经常会把它当作一个升级版的
ListView
组件使用,因为
ListView
每次只能显示一列数据集,而使用
TableWidget
组件显示多列显得不够美观,此时使用Tree组件显示单层结构是最理想的方式,本章博文将通过
TreeWidget
实现多字段显示,并增加一个自定义菜单,通过在指定记录上右键可弹出该菜单并对指定记录进行操作。
1.通过
TreeView
组件实现一个只读属性的树形目录,该目录中指定三个字段,分别用来表示
ID,IP地址,用户名
字段.
初始化Tree组件
- 1.初始化并设置treeView属性
- 2.设置列头长度
- 3.设置列头数据
- 4.设置表中元素
#include <QSplitter>#include <QTreeView>#include <QTextCodec>#include <QStandardItemModel>// By: LyShark// https://www.cnblogs.com/lysharkMainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);QStandardItemModel *tree = new QStandardItemModel(0,3,this);// 设置treeView属性ui->treeView->setColumnWidth(0,300); // 设置最后一列宽度自适应ui->treeView->setIndentation(1); // 设置表头缩进为1ui->treeView->setEditTriggers(QAbstractItemView::NoEditTriggers); // 节点不可编辑// 设置列头长度ui->treeView->setColumnWidth(0,50); // 设置第1列长度ui->treeView->setColumnWidth(1,200); // 设置第2列长度ui->treeView->setColumnWidth(2,200); // 设置第3列长度// 设置列头数据tree->setHeaderData(0, Qt::Horizontal, tr(\"ID\"));tree->setHeaderData(1, Qt::Horizontal, tr(\"IP地址\"));tree->setHeaderData(2, Qt::Horizontal, tr(\"用户\"));ui->treeView->setModel(tree); // 将表头设置到模型// 设置表中元素QList<QStandardItem *> ptr;QStandardItem *item_uid = new QStandardItem(\"1001\");item_uid->setIcon(QIcon(\":/image/1.ico\"));ptr.push_back(item_uid);QStandardItem *item_addr = new QStandardItem(\"192.168.1.1\");ptr.push_back(item_addr);QStandardItem *item_username = new QStandardItem(\"lyshark\");ptr.push_back(item_username);tree->appendRow(ptr);}
代码运行后,如下所示:
2.使用
TreeWidget
组件,自己定义一个菜单,并将该菜单绑定到Tree组件内,具体实现代码如下。
#include \"mainwindow.h\"#include \"ui_mainwindow.h\"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow){ui->setupUi(this);// 在MainWindow中使用右击菜单需要添加此项ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);// 创建基础顶部菜单QMenuBar *bar = menuBar();this->setMenuBar(bar);QMenu * fileMenu = bar->addMenu(\"菜单1\");// 实现只隐藏菜单1其他的不受影响fileMenu->menuAction()->setVisible(false);// 添加子菜单GetColumnAction = fileMenu->addAction(\"获取列号\");GetRowDataAction = fileMenu->addAction(\"获取本行数据\");GetLineAction = fileMenu->addAction(\"获取行号\");// 分别设置图标GetColumnAction->setIcon(QIcon(\":/image/1.ico\"));GetRowDataAction->setIcon(QIcon(\":/image/2.ico\"));GetLineAction->setIcon(QIcon(\":/image/3.ico\"));// 为子菜单绑定热键GetColumnAction->setShortcut(Qt::CTRL | Qt::Key_A);GetRowDataAction->setShortcut(Qt::SHIFT | Qt::Key_56cS);GetLineAction->setShortcut(Qt::CTRL | Qt::SHIFT | Qt::Key_B);// 设置treeWidget属性ui->treeWidget->setColumnCount(4); // 设置总列数ui->treeWidget->setColumnWidth(0,300); // 设置最后一列宽度自适应ui->treeWidget->setIndentation(1); // 设置表头缩进为1// 设置表头数据QStringList headers;headers.append(\"文件名\");headers.append(\"更新时间\");headers.append(\"文件类型\");headers.append(\"文件大小\");ui->treeWidget->setHeaderLabels(headers);// 模拟插入数据到表中for(int x=0;x<100;x++){QTreeWidgetItem* item=new QTreeWidgetItem();item->setText(0,\"<lyshark.com>\");item->setIcon(0,QIcon(\":/image/1.ico\"));item->setText(1,\"2020-12-11\");item->setText(2,\"*.pdf\");item->setText(3,\"102MB\");item->setIcon(3,QIcon(\":/image/2.ico\"));ui->treeWidget->addTopLevelItem(item);}}MainWindow::~MainWindow(){delete ui;}// 当treeWidget中的右键被点击时则触发// By: LyShark// https://www.cnblogs.com/lysharkvoid MainWindow::on_treeWidget_customContextMenuRequested(const QPoint &pos){Q_UNUSED(pos);// 新建Menu菜单QMenu *ptr = new QMenu(this);// 添加Actions创建菜单1c34项ptr->addAction(GetColumnAction);ptr->addAction(GetLineAction);// 添加一个分割线ptr->addSeparator();ptr->addAction(GetRowDataAction);// 在鼠标光标位置显示右键快捷菜单ptr->exec(QCursor::pos());// 手工创建的指针必须手工删除delete ptr;}
最终我们实现的效果如下所示。