TreeWidget 目录树组件,该组件适用于创建和管理目录树结构,在开发中我们经常会把它当作一个升级版的ListView
组件使用,因为ListView
每次只能显示一列数据集,而使用TableWidget
组件显示多列显得不够美观,此时使用Tree组件显示单层结构是最理想的方式,本章博文将通过TreeWidget
实现多字段显示,并增加一个自定义菜单,通过在指定记录上右键可弹出该菜单并对指定记录进行操作。
1.通过TreeView
组件实现一个只读属性的树形目录,该目录中指定三个字段,分别用来表示ID,IP地址,用户名
字段.
初始化Tree组件
- 1.初始化并设置treeView属性
- 2.设置列头长度
- 3.设置列头数据
- 4.设置表中元素
#include <QSplitter> #include <QTreeView> #include <QTextCodec> #include <QStandardItemModel>
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),ui(new Ui::MainWindow) { ui->setupUi(this);
QStandardItemModel *tree = new QStandardItemModel(0,3,this);
ui->treeView->setColumnWidth(0,300); ui->treeView->setIndentation(1); ui->treeView->setEditTriggers(QAbstractItemView::NoEditTriggers);
ui->treeView->setColumnWidth(0,50); ui->treeView->setColumnWidth(1,200); ui->treeView->setColumnWidth(2,200);
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);
ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
QMenuBar *bar = menuBar(); this->setMenuBar(bar); QMenu * fileMenu = bar->addMenu("菜单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_S); GetLineAction->setShortcut(Qt::CTRL | Qt::SHIFT | Qt::Key_B);
connect(GetColumnAction,&QAction::triggered,this,[=](){ int col = ui->treeWidget->currentColumn(); std::cout << col << std::endl; });
connect(GetRowDataAction,&QAction::triggered,this,[=](){ QString msg = ui->treeWidget->currentItem()->text(0); std::cout << msg.toStdString().data() << std::endl; });
connect(GetLineAction,&QAction::triggered,this,[=](){ int row = ui->treeWidget->currentIndex().row(); std::cout << row << std::endl; });
ui->treeWidget->setColumnCount(4); ui->treeWidget->setColumnWidth(0,300); ui->treeWidget->setIndentation(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; }
void MainWindow::on_treeWidget_customContextMenuRequested(const QPoint &pos) { std::cout << "x pos = "<< pos.x() << "y pos = " << pos.y() << std::endl; Q_UNUSED(pos);
QMenu *ptr = new QMenu(this);
ptr->addAction(GetColumnAction); ptr->addAction(GetLineAction);
ptr->addSeparator(); ptr->addAction(GetRowDataAction);
ptr->exec(QCursor::pos()); delete ptr; }
|
最终我们实现的效果如下所示。
