C/C++ Qt TreeWidget 单层树形组件应用
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/lyshark
MainWindow::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); // 设置表头缩进为1
ui->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_S);
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/lyshark
void MainWindow::on_treeWidget_customContextMenuRequested(const QPoint &pos)
{
Q_UNUSED(pos);
// 新建Menu菜单
QMenu *ptr = new QMenu(this);
// 添加Actions创建菜单项
ptr->addAction(GetColumnAction);
ptr->addAction(GetLineAction);
// 添加一个分割线
ptr->addSeparator();
ptr->addAction(GetRowDataAction);
// 在鼠标光标位置显示右键快捷菜单
ptr->exec(QCursor::pos());
// 手工创建的指针必须手工删除
delete ptr;
}
最终我们实现的效果是以下效果。
C/C++ Qt TreeWidget 单层树形组件应用的更多相关文章
- C/C++ Qt TreeWidget 嵌套节点操作技巧
在上一篇博文<C/C++ Qt TreeWidget 单层树形组件应用>中给大家演示了如何使用TreeWidget组件创建单层树形结构,并给这个树形组件增加了右键菜单功能,接下来将继续延申 ...
- JS组件系列——分享自己封装的Bootstrap树形组件:jqTree
前言:之前的一篇介绍了下如何封装自己的组件,这篇再次来体验下自己封装组件的乐趣.看过博主博客的园友应该记得之前分享过一篇树形菜单的使用JS组件系列——Bootstrap 树控件使用经验分享,这篇里面第 ...
- qt qml qchart 图表组件
qt qml qchart 图表组件 * Author: Julien Wintz * Created: Thu Feb 13 23:41:59 2014 (+0100) 这玩意是从chart.js迁 ...
- 第30课 Qt中的文本编辑组件
1. 3种常用的文本编辑组件的比较 单行文本支持 多行文本支持 自定义格式支持 富文本支持 QLineEdit (单行文本编辑组件) Yes No No No QPlainTextEdit (多行普通 ...
- 转:vue+element实现树形组件
项目中需要用到树形组件,在网上发现一个用vue+element实现的树形组件,现在记录下: demo地址:https://github.com/wilsonIs/vue-treeSelect
- element-ui tree树形组件自定义实现可展开选择表格
最近做项目遇到一个需求,表格里可以展开,可以选择,大概效果如下图: 一开始是在table组件里找方法,使用了表格的合并方法,效果是实现了,但是表格的多选每次触发时,都会执行好几次,而且没法实现一部分的 ...
- LayUi 树形组件tree 实现懒加载模式,展开父节点时异步加载子节点数据
LayUi框架中树形组件tree官方还在持续完善中,目前最新版本为v2.5.5 官方树形组件目前还不支持懒加载方式,之前我修改一版是通过reload重载实例方法填充子节点数据方式,因为递归页面元素时存 ...
- element中的树形组件,如何获取父级菜单的id
一般多选的树形组件,使用getCheckedNodes()方法只能获取到本级的菜单id,只有在子菜单全部选中的情况下才会选中上级.但我们想要不全选中子级的情况下也要获取它的上级,甚至上上级等,怎么办呢 ...
- QT使用提升自定义组件
QT使用提升自定义组件 QTC++QT自定义 QT 组件提升来实现自定义功能 介绍 我们在使用QT设置界面之后,往往需要自己实现一些方法,如果是单独 的还好,但是如果遇到很多同类型的都有需求, 比如 ...
随机推荐
- 论文解读(MPNN)Neural Message Passing for Quantum Chemistry
论文标题:DEEP GRAPH INFOMAX 论文方向: 论文来源:ICML 2017 论文链接:https://arxiv.org/abs/1704.01212 论文代码: 1 介绍 本文的目标 ...
- 结对编程——带UI的小初高数学学习软件
一.简介 本次项目要求: 1.所有功能通过图形化界面操作,可以是桌面应用,可以是网站(编程语言和技术不限): 2.用户注册功能.用户提供手机号码,点击注册将收到一个注册码,用户可使用该注册码完成注册: ...
- Kubernetes-Service介绍(三)-Ingress(含最新版安装踩坑实践)
前言 本篇是Kubernetes第十篇,大家一定要把环境搭建起来,看是解决不了问题的,必须实战. Kubernetes系列文章: Kubernetes介绍 Kubernetes环境搭建 Kuberne ...
- 初学python-day4 字典(已更新完)
- Java 是编译型语言还是解释型语言?
Java首先由编译器编译成.class类型的文件,这个是java自己类型的文件.然后在通过虚拟机(JVM)从.class文件中读一行解释执行一行.因此Java是一种半编译半解释的语言,理解这种意思即可 ...
- docker run 的基本用法
docker run 命令用来创建并启动一个容器 语法:docker run [options] image [command] [args-] 示例:docker run -dit -v 别名:容器 ...
- Noip模拟53 2021.9.14
T1 ZYB和售货机 首先这道题有两种做法. 一种是发现每个点都可以先被取到只剩一个,只要收益大于$0$ 然后发现建一个$i->f[i]$的图时出现环,要把它去掉, 那么跑一个$tarjan$枚 ...
- PCIE学习笔记--TLP Header详解(三)
目录篇地址为:http://blog.chinaaet.com/justlxy/p/5100053481 Completions Completions的TLP Header的格式如下图所示: 这里来 ...
- Python 模块 itertools
python 2.6 引入了itertools模块,使得排列组合的实现非常简单: import itertools 有序排列:e.g., 4个数内选2个排列: >>> print l ...
- 《手把手教你》系列技巧篇(三十七)-java+ selenium自动化测试-日历时间控件-上篇(详解教程)
1.简介 我们在实际工作中,有可能遇到有些web产品,网页上有一些时间选择,然后支持按照不同时间段范围去筛选数据.网页上日历控件一般,是一个文本输入框,鼠标点击,就会弹出日历界面,可以选择具体日期.这 ...