Qt获取磁盘信息+表格显示

效果展示

image.png

主要代码

获取磁盘相关数据

获取磁盘数据 Qt 没有提供相关的接口,需要使用 Windows API。接口解释如下:

BOOL GetDiskFreeSpaceExW([in, optional]  LPCWSTR         lpDirectoryName,[out, optional] PULARGE_INTEGER lpFreeBytesAvailableToCaller,[out, optional] PULARGE_INTEGER lpTotalNumberOfBytes,[out, optional] PULARGE_INTEGER lpTotalNumberOfFreeBytes
);

[in, optional] lpDirectoryName
磁盘上的目录。
如果此参数为 NULL,则该函数使用当前磁盘的根。
如果此参数是 UNC 名称,则必须包含尾随反斜杠,例如“\MyServer\MyShare\”。
此参数不必指定磁盘上的根目录。 函数接受磁盘上的任何目录。
调用应用程序必须对此具有 FILE_LIST_DIRECTORY 访问权限
"sample"目录中。

[out, optional] lpFreeBytesAvailableToCaller
指向变量的指针,该变量接收磁盘上可供与调用线程关联的用户使用的可用字节总数。
此参数可以为 NULL。
如果使用每用户配额,此值可能小于磁盘上的可用字节总数。

[out, optional] lpTotalNumberOfBytes
指向变量的指针,该变量接收磁盘上可供与调用线程关联的用户使用的字节总数。
此参数可以为 NULL。
如果使用每用户配额,此值可能小于磁盘上的字节总数。
若要确定磁盘或卷上的字节总数,请使用 IOCTL_DISK_GET_LENGTH_INFO。

[out, optional] lpTotalNumberOfFreeBytes
指向接收磁盘上可用字节总数的变量的指针。
此参数可以为 NULL。

如果该函数成功,则返回值为非零值。
如果函数失败,则返回值为零 (0)。要获得更多的错误信息,请调用 GetLastError。

在实际使用的时候,我们依然需要注意数据类型转化等问题,还需要进行一定的计算才能获得我们需要的数据:

void DiskSizeTable::loadData()
{int row = this->rowCount();for (size_t i = 0; i < row; i++) {this->removeRow(0);}#ifdef Q_OS_WINQFileInfoList list = QDir::drives();foreach (QFileInfo dir, list) {QString dirName = dir.absolutePath();LPCWSTR lpcwstrDriver = (LPCWSTR)dirName.utf16();ULARGE_INTEGER liFreeBytesAvailable, liTotalBytes, liTotalFreeBytes;if (GetDiskFreeSpaceEx(lpcwstrDriver, &liFreeBytesAvailable, &liTotalBytes, &liTotalFreeBytes)) {QString use = QString::number((double)(liTotalBytes.QuadPart - liTotalFreeBytes.QuadPart) / GB, 'f', 1);use += "G";QString free = QString::number((double)liTotalFreeBytes.QuadPart / GB, 'f', 1);free += "G";QString all = QString::number((double)liTotalBytes.QuadPart / GB, 'f', 1);all += "G";int percent = 100 - ((double)liTotalFreeBytes.QuadPart / liTotalBytes.QuadPart) * 100;insertSize(dirName, use, free, all, percent);}}
#elseprocess->start("df -h");#endif
}

如果是 Windows 系统(Q_OS_WIN)的话就调用 Windows API,如果是其他的类 Unix 系统就会启动一个进程执行 df -h 命令,该命令在类 Unix 系统中用于显示文件系统的磁盘空间占用情况。这部分代码未提供处理命令输出的逻辑,但可以通过信号和槽机制或者重定向标准输出流来读取结果。

表格数据显示

我直接将重要的部分注释在代码里:

void DiskSizeTable::insertSize(const QString &name, const QString &use, const QString &free, const QString &all, int percent)
{int row = this->rowCount();this->insertRow(row);QTableWidgetItem* itemname = new QTableWidgetItem(name);QTableWidgetItem* itemuse = new QTableWidgetItem(use);itemuse->setTextAlignment(Qt::AlignCenter); // 居中显示QTableWidgetItem* itemfree = new QTableWidgetItem(free);itemfree->setTextAlignment(Qt::AlignCenter);QTableWidgetItem* itemall = new QTableWidgetItem(all);itemall->setTextAlignment(Qt::AlignCenter);this->setItem(row, 0, itemname);this->setItem(row, 1, itemuse);this->setItem(row, 2, itemfree);this->setItem(row, 3, itemall);QProgressBar* bar = new QProgressBar;bar->setRange(0, 100); // 数据区间bar->setValue(percent);QString qss = QString("QProgressBar{background:%1;border-width:0px;border-radius:0px;text-align:center;}""QProgress::chunk{border-radius:0px;}").arg(bgColor.name());// 根据使用情况来设置颜色if (percent < 50) {qss += QString("QProgressBar{color:%1;}QProgressBar::chunk{background:%2;}").arg(textColor1.name()).arg(pgrColor1.name());}else if (percent < 90) {qss += QString("QProgressBar{color:%1;}QProgressBar::chunk{background:%2;}").arg(textColor2.name()).arg(pgrColor2.name());}else {qss += QString("QProgressBar{color:%1;}QProgressBar::chunk{background:%2;}").arg(textColor3.name()).arg(pgrColor3.name());}bar->setStyleSheet(qss);this->setCellWidget(row, 4, bar); // 在QTableWidget中添加其他窗口
}

表格的一些设置

this->setSelectionBehavior(QAbstractItemView::SelectRows); // 选择行为:整行
this->setEditTriggers(QAbstractItemView::NoEditTriggers); // 编辑触发:不触发(无法编辑)
this->setSelectionMode(QAbstractItemView::SingleSelection); // 选择模式:一次只能选中一行
this->verticalHeader()->setVisible(true); // 行头可见
this->horizontalHeader()->setStretchLastSection(true); // 最后一列自动伸展填充

完整代码

gitcode 链接

资料参考:https://github.com/0voice

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/882472.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MongoDB Shell 基本命令(一)

MongoDB Shell 基本命令(一&#xff09; 1. 基本概念 SQL术语/概念MongoDB术语/概念解释/说明databasedb数据库tablecollection数据库表/集合rowdocument数据记录行/文档columnfield数据字段/域indexindex索引table joins表连接,MongoDB不支持primary keyprimary key主键,Mon…

推荐算法的学习

文章目录 前言1、模型1.1 从本领域模型的发展历史中学习1.1.1 在历史中总结发展规律和趋势1.1.2 发现模型之间的共性&#xff0c;方便记忆 1.2 从其他领域的发展中学习1.2.1 注意力机制1.2.2 残差网络 1.3 实践该怎么办&#xff1f; 2、 特征2.1 数据源的选择与建立2.2 特征构造…

Python生成随机密码脚本

引言 在数字化时代&#xff0c;密码已成为我们保护个人信息和数据安全的重要手段。然而&#xff0c;手动创建复杂且难以猜测的密码是一项既繁琐又容易出错的任务。幸运的是&#xff0c;Python编程语言为我们提供了一种高效且灵活的方法来自动生成随机密码。本文将详细介绍如何…

android app执行shell命令视频课程补充android 10/11适配-千里马android

(https://blog.csdn.net/learnframework/article/details/120103471) https://blog.csdn.net/learnframework/article/details/120103471 hi&#xff0c;有学员在学习跨进程通信专题课程时候&#xff0c;在实战app执行一个shell命令的项目时候&#xff0c;对课程本身的android …

Day3 线性表(Linear List)

Day3 线性表&#xff08;Linear List&#xff09; 定义&#xff1a; 是具有相同数据类型的n(n>0)个数据元素的有限序列&#xff0c;其中n为表长&#xff0c;当n0时线性表是一个控标。若用L命名线性表&#xff0c;则其一般表示为&#xff1a;L(a1,a2,a3,a4,.....ai,ai1....…

【高等数学】无穷级数

0. 了解 无穷级数是指将无穷多个数按照一定的规律相加起来的表达式。 打个比方,就像你有一个无穷长的梯子,每一级梯子代表一个数。把这些数一个一个加起来,就形成了无穷级数。 比如常见的等比级数,这里是首项,是公比。如果,这个等比级数是收敛的,也就是它的和是一个有限…

Hackmyvm-Lookup

0x00信息收集 0x01端口扫描 PORT STATE SERVICE 22/tcp open ssh 80/tcp open http MAC Address: 08:00:27:0A:44:CF (Oracle VirtualBox virtual NIC)22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.9 (Ubuntu Linux; protocol 2.0)80/tcp open http Apache ht…

数据权限的设计与实现系列13——前端筛选器组件Everright-filter集成多控制维度实现

‍ 数据权限多维度实现 上面的所有工作&#xff0c;实际都是基于业务实体属性这一数据权限控制维度展开的。 接下来&#xff0c;我们来设计与实现多维度&#xff0c;主要是用户组&#xff08;即角色&#xff09;、组织机构和用户。 ‍ 业务需求分析 用户控制维度 业务场景…

【latex中三线表格】

在 LaTeX 中&#xff0c;三线表格&#xff08;也称为 “三线表” 或 “三线式表格”&#xff09;通常使用 booktabs 宏包来实现。这种表格通过三条水平线&#xff08;表头上、表头下、表格底部&#xff09;来简洁地展示表格数据。下面是一个创建三线表格的 LaTeX 代码示例&…

【MATLAB代码】指纹定位方法(KNN)介绍与例程(二维、轨迹定位),源代码可复制粘贴到MATLAB上运行

文章目录 指纹定位指纹定位技术简介基本原理位置估算公式1. 最近邻居算法(KNN)2. 加权最近邻居算法(W-KNN)3. 最小二乘法(LS)最终位置 P P P通过求解下面的方程获得:应用场景优缺点优点缺点总结源代码代码运行运行方法运行结果指纹定位 指纹定位技术简介 指纹定位是一…

一文讲清楚 OAuth 2.0 支持的四个授权流程

目录 1、授权码授权流程&#xff08;Authorization Code Grant&#xff09; 2、隐式授权流程&#xff08;Implicit Grant&#xff09; 3、密码凭证授权流程&#xff08;Resource Owner Password Credentials Grant&#xff09; 4、客户端凭证授权流程&#xff08;Client Cre…

python 更换pip源

你可以通过修改 pip 的配置文件来换源。以下是步骤&#xff1a; 创建或编辑 ~/.pip/pip.conf&#xff08;Linux/macOS&#xff09;或 %USERPROFILE%\pip\pip.ini&#xff08;Windows&#xff09;。 添加以下内容以更换为阿里云源为例&#xff1a; [global] index-url https…

SpringBoot日常:封装redission starter组件

文章目录 逻辑实现POM.xmlRedissionConfigRedissionPropertiesRedissionUtilsspring.factories 功能测试application.yml配置POM.xmlTestController运行测试 本章内容主要介绍如何通过封装相关的redission连接配置和工具类&#xff0c;最终完成一个通用的redission starter。并…

洛谷 P1038 [NOIP2003 提高组] 神经网络(拓扑排序)

题目传送门 感觉这道题需要我们高超的语文阅读水平…… 解题思路 我们发现要计算一个细胞的状态值&#xff08;&#xff09;&#xff0c;就需要先算出有边指向它的其他细胞对答案的贡献&#xff1b; 这是有拓扑序的&#xff0c;所以我们想到拓扑排序。 题目中说了&#xff0…

FastDFS单节点部署

FastDFS单节点部署 1、FastDFS入门1.1 分布式文件系统1.2 FastDFS 简介1.3 FastDFS 发展历史1.4 FastDFS 整体架构1.5 FastDFS 线上使用者 2、FastDFS 环境搭建2.1 FastDFS 安装2.1.1 安装前的准备2.1.2 安装 libfastcommon库2.1.3 安装 FastDFS 2.2FastDFS 配置2.2.1 去掉/etc…

即使是编程新手,也能利用ChatGPT编写高质量的EA

在外汇交易领域&#xff0c;MetaTrader是一款备受欢迎的交易软件&#xff0c;包括MT5和MT4&#xff0c;提供了众多强大的分析工具和自动化交易功能。对于没有编程经验的新手而言&#xff0c;编写专家顾问&#xff08;EA&#xff09;可能显得既复杂又令人望而却步。幸运的是&…

数据结构——链表,哈希表

文章目录 链表python实现双向链表复杂度分析 哈希表&#xff08;散列表&#xff09;python实现哈希表哈希表的应用 链表 python实现 class Node:def __init__(self, item):self.item itemself.next Nonedef head_create_linklist(li):head Node(li[0])for element in li[1…

spring6 IoC容器详解

目录 一、引言 示例开发 示例分析 启用Log4j2日志框架 使用方式 二、IoC容器 IoC容器 1.控制反转&#xff08;IoC&#xff09; 2.依赖注入 3.IoC容器在Spring的实现 基于XML管理Bean 依赖注入之setter注入 依赖注入之构造器注入 Bean生命周期 基于xml自动装配 …

基于SSM+微信小程序的打印室预约管理系统(打印2)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的打印室预约管理系统实现了管理员和用户两个角色。 1、管理员功能有个人中心&#xff0c;用户管理&#xff0c;附近打印店管理&#xff0c;文件打印管理&#xff0c;当…

yocto基础 -- bb 文件字段解析

Yocto .bb 文件字段解析 本文详细讲解了 Yocto .bb 文件中各字段的作用和用法&#xff0c;包括 SECTION、SRC_URI、SUMMARY 等&#xff0c;旨在帮助开发者更好地理解和使用 Yocto 构建系统。 目录 1. SECTION 字段 1.1 SECTION 的作用1.2 SECTION 的用法1.3 如何使用 SECTIO…