QTreeWidget使用记录(2)

server/2024/11/28 5:27:20/

目的:使用QTreeWidget来浏览硬盘目录的文件结构。

功能要求:

1.选择某一磁盘根目录后,显示根目录下的文件和文件夹,且显示对应的图标;

2.单击列表项的箭头区域展开和折叠,展开时加载下一层级的文件和文件夹;

3.单击列表项的图标或者文本区域为选中状态;

4.样式设置,包括边框,表头视图、底色、选中、鼠标Hover,滚动条的样式。

实现方案:

2.单击列表项的箭头区域展开和折叠,展开时加载下一层级的文件和文件夹;

默认情况下单击QTreeWidgetItem可展开折叠,即连接一下信号槽即可:

connect(ui.m_treeWidget, &QTreeWidget::itemClicked, this, &CDemoSettingsView::slotClicked);

但是本文单击需要选中Item,不展开,所以设计为子类化QTreeWidgetItem,通过事件过滤来重发itemClick信号。参考代码实现如下:

bool CDirsTreeWidget::eventFilter(QObject * watched, QEvent * event)
{if (watched == viewport()){if (event->type() == QEvent::MouseButtonPress) {QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);if (mouseEvent->button() == Qt::LeftButton) {QTreeWidgetItem *item = this->itemAt(mouseEvent->pos());int count = this->indexOfTopLevelItem(item);QRect rc = this->visualItemRect(item);if (item != nullptr) {QPoint pos = mouseEvent->pos();if (pos.x() < rc.x()) {m_arrowPress = true;}}}}else if (event->type() == QEvent::MouseButtonRelease){QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);if (mouseEvent->button() == Qt::LeftButton) {QTreeWidgetItem *item = this->itemAt(mouseEvent->pos());if (item != nullptr) {QPoint pos = mouseEvent->pos();QRect rc = this->visualItemRect(item);if (pos.x() < rc.x()) {if (m_arrowPress){emit itemClicked(item, 0);m_arrowPress = false;return true;}}}}}}return QTreeWidget::eventFilter(watched, event); // 事件未被接受,传递给父类处理
}

其中    QRect rc = this->visualItemRect(item);可获得箭头X的右侧范围,通过判断这个值就可以限定到点击点头才发送itemClick信号,从而实现展开/折叠、选中分开。然后再itemClick的槽函数中进一步获取文件和文件夹。参考代码如下:

  void CDemoSettingsView::slotClicked(QTreeWidgetItem * item, int column)
{if (item->data(0, Qt::UserRole + 1).toBool())   // 为true,已经添加过了,不用再添加了return;item->setData(0, Qt::UserRole + 1, true);QString file = item->data(0, Qt::UserRole).toString() + item->text(0);QFileInfo* fileInfo = new QFileInfo(file);if (fileInfo->isDir()) {getFileOnDirectory(item, file);    // 是文件夹就获取里面的文件,添加子节点}item->setExpanded(true);
}void CDemoSettingsView::getFileOnDirectory(QTreeWidgetItem* item, QString directoryPath)
{QDir dir(directoryPath);QFileInfoList fileInfoList = dir.entryInfoList();QFileIconProvider iconProvider;for (QFileInfo fileInfo : fileInfoList) {if (fileInfo.fileName() == "." || fileInfo.fileName() == "..")continue;QString filepath = fileInfo.path();QString filename = fileInfo.fileName();QTreeWidgetItem* child = new QTreeWidgetItem();child->setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicatorWhenChildless);child->setText(0, filename);child->setIcon(0, QIcon(iconProvider.icon(fileInfo)));child->setData(0, Qt::UserRole, filepath+"/"); child->setData(0, Qt::UserRole + 1, false); item->addChild(child); }
}


http://www.ppmy.cn/server/137736.html

相关文章

Qt中的面试问答

1. 什么是 Qt&#xff1f;它的主要功能是什么&#xff1f; 答案&#xff1a;Qt 是一个跨平台的应用程序开发框架&#xff0c;主要用于开发具有图形用户界面的应用程序。它提供了丰富的库和工具&#xff0c;包括 GUI 组件、网络功能、数据库访问、多线程支持和国际化等。 2. Q…

C#如何锁定和解除鼠标及键盘BlockInput

在C#中&#xff0c;"BlockInput"通常指的是一个功能或方法&#xff0c;用于阻止或暂停用户输入一段时间。这在某些特定的应用场景下非常有用&#xff0c;比如在游戏中防止玩家连续快速点击导致游戏逻辑错误&#xff0c;或者在UI应用中防止用户在某个操作正在进行时进…

Linux特种文件系统--tmpfs文件系统

tmpfs类似于RamDisk&#xff08;只能使用物理内存&#xff09;&#xff0c;使用虚拟内存&#xff08;简称VM&#xff09;子系统的页面存储文件。tmpfs完全依赖VM&#xff0c;遵循子系统的整体调度策略。说白了tmpfs跟普通进程差不多&#xff0c;使用的都是某种形式的虚拟内存&a…

【C/C++】qsort函数的学习与使用

零.导言 在之前的文章中&#xff0c;我介绍了冒泡排序&#xff0c;即按ASCII码值把元素从小到大排序&#xff08;文章链接我放在了第五部分&#xff0c;有兴趣的小伙伴可以求看看&#xff09;。而今天我将继续介绍qsort函数&#xff0c;这个函数可以起到和冒泡排序一样的作用&a…

【数据结构】数组和向量

### 什么是数组&#xff1f; 想象一下&#xff0c;你有一个装糖果的长盒子。这个盒子里有很多小格子&#xff0c;每个格子里可以放一颗糖果。数组就像这个盒子&#xff0c;每个小格子就是一个位置&#xff0c;我们叫它“元素”。当你想找某颗糖果时&#xff0c;只需要知道它在…

数据结构初识及顺序表详解

目录 1.数据结构相关概念 2.为什么需要数据结构&#xff1f; 3.顺序表 1.概念 2.结构 3.顺序表的类型 3.1静态顺序表 3.2动态顺序表 4.顺序表的实现 1.准备工作 2.基础接口实现 2.1创建动态顺序表结构 2.2顺序表初始化 2.3顺序表的销毁 2.4顺序表的打印 3.顺序…

Rust 力扣 - 238. 除自身以外数组的乘积

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 这题主要有个关键点&#xff0c;就是元素能取0&#xff0c;然后我们分类讨论元素为0的数量 如果数组中存在至少两个元素为0&#xff0c;则每个元素的除自身以外的乘积为0如果数组中仅存在一个0&#xff0c;则为…

【React】react-app-env.d.ts 文件

在使用 create-react-app 生成的 TypeScript 项目模板中&#xff0c;react-app-env.d.ts 文件的作用是为 React 应用中的全局变量和类型进行声明。 全局类型声明&#xff1a;react-app-env.d.ts 文件会引入 react-scripts 提供的全局类型定义&#xff0c;这些类型定义扩展了 Ty…