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.rhkb.cn/news/451625.html

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

相关文章

GPIO口的学习

推挽输出 用它去控制一个mos管&#xff0c;当输出高电平时电流这样流出去&#xff0c;给外面的这颗mos管的栅极充电&#xff0c;所以这个过程称为推把电流推出去 然后当IO口输出低电平时电流这样流进来,给外面的这颗mos管的栅极放电,那这就是挽&#xff0c;把电流挽回来,所以所…

【汇编语言】寄存器(内存访问)(七)—— CPU提供的栈机制

文章目录 前言1. CPU提供的栈机制2. push指令3. 问题4. 问题的分析与解答5. pop指令结语 前言 &#x1f4cc; 汇编语言是很多相关课程&#xff08;如数据结构、操作系统、微机原理&#xff09;的重要基础。但仅仅从课程的角度出发就太片面了&#xff0c;其实学习汇编语言可以深…

fmql之Linux Uart

正点原子第48章。 串口收发测试 正点原子教程 RS232和RS485的串口收发测试是一样的。 // 设置串口波特率为115200 stty -F /dev/ttyPS1 ispeed 115200 ospeed 115200 cs8// 发送字符串 echo "www.openedv.com" >/dev/ttyPS1// 接收数据 cat /dev/ttyPS1 fmql测…

强烈推荐Kafka动画入门概念的3个讲座

强烈推荐Kafka动画入门概念的3个讲座&#xff0c;3个都是动画讲解&#xff0c;十分不错&#xff0c; 1、主题、偏移量和分区 ~ Kafka核心概念(Part1) 地址&#xff1a;主题、偏移量和分区 ~ Kafka核心概念(Part1)_哔哩哔哩_bilibili 2、偏移量提交、重平衡和消费者组 ~ Kafka核…

C Primer Plus 第9章——第一篇

你该逆袭了 文章目录 一、复习函数1、定义带形式参数的函数2、声明带形式参数函数的原型3、使用 return 从函数中返回值&#xff08;1&#xff09;、返回值不仅可以赋给变量&#xff0c;也可以被用作表达式的一部分。&#xff08;2&#xff09;、返回值不一定是变量的值&#x…

【Linux】进程池

目录 进程池 进程池的概念&#xff1a; 手搓进程池&#xff1a; 1、创建信道和子进程 2、通过channel控制子进程 3、回收管道和子进程 进程池 进程池的概念&#xff1a; 定义一个池子&#xff0c;在里面放上固定数量的进程&#xff0c;有需求来了&#xff0c;就拿一个池中…

微信小程序考试系统(lw+演示+源码+运行)

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了微信小程序考试系统的开发全过程。通过分析微信小程序考试系统管理的不足&#xff0c;创建了一个计算机管理微信小程序考试系统的方案。文章介绍了微信小程序考…

Leetcode 二叉搜索树的第 K 个元素

复习一下二叉搜索树 二叉搜索树 (Binary Search Tree, 简称 BST) 是一种特殊的二叉树(可以为空)&#xff0c;其中每个节点都有一个值&#xff0c;并且满足以下特点&#xff1a; 定义&#xff1a; 左子树节点的值小于根节点的值&#xff1a;对于每个节点&#xff0c;左子树中所…

力扣66~70题

题66&#xff08;简单&#xff09;&#xff1a; python代码&#xff1a; class Solution:def plusOne(self, digits: List[int]) -> List[int]:s_str.join([str(i) for i in digits])nstr(int(s_str)1)n_strlist(n)res[int(i) for i in n_str]return res题67&#xff08;简…

Vscode的远程开发之VScode优势(一)

一、VSCode 优势 时代的弄潮儿 vscode是微软开源的基于electron的编辑器&#xff0c;通过各种各样的插件&#xff0c;它能够变成你最花里胡哨的IDE。 vscode 最大的特点与优势就是它将Server与Client解耦&#xff1a; 作为Client的vscode&#xff0c;他只负责作为文本编辑器…

kali的学习

一、Namp的使用 首次使用时&#xff0c;要确保Metasploitable已经启动并正在运行 nmap扫描原理&#xff1a; 首先判断nmap传输的命令行中是否包含域名&#xff0c;如果包含需要利用DNS服务器进行域名分析&#xff0c;然后发送ICMP Echo Request 来探测主机存活性。 nmap默认扫描…

判断在子集

今天晚上练习赛的A没写括号&#xff0c;搞了好久&#xff0c;真的是醉了。。。 #include<bits/stdc.h> using namespace std; typedef long long ll; int t; int main() {cin>>t;while(t--){ll x,y;cin>>x>>y;if(x<y)swap(x,y);if(xy)cout<<0…

构建现代化车辆管理系统:SpringBoot实践

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理车辆管理系统的相关信息成为必然。开发合适…

理解VSCODE基于配置的设置,避免臃肿

这节课我们讲两点&#xff1a; &#xff08;一&#xff09;下载、安装、汉化及美化 VSCODE&#xff1b; &#xff08;二&#xff09;理解VSCODE中基于配置&#xff08;Profiles&#xff09;的设置&#xff08;Settings&#xff09;&#xff0c;让 VSCODE 保持清爽。 &#xff0…

基于SpringBoot+Vue+uniapp的电影信息推荐APP的详细设计和实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

CTFHUB技能树之SQL——Refer注入

开启靶场&#xff0c;打开链接&#xff1a; 直接挑明是Refer注入 用burp抓包发送到repeater&#xff1a; 发现缺少referer报文头&#xff0c;添加一下&#xff0c;判断是整数型注入还是字符型注入&#xff1a; Referer: 1 and 11# 正常回显 1 and 12# 回显错误&#xff0c;说…

外星人木乃伊---我的收藏

我收藏了一个与我们星球上任何已知物种无关的非人类标本的明显例子&#xff0c;这具木乃伊遗骸作为地球上存在「非人类」外星人证据。测试证实这些遗骸含有「不来自任何已知物种」的DNA。7%的遗骸DNA“不来自任何已知物种”。这标本不属于我们的陆地进化。它们不是不明飞行物坠…

【android开发】android端部署yolov11-pose实现体测计数

android端部署yolov11-pose实现体测计数 系统概述一、自制关键点数据集预览二、Android Studio项目结构预览三、平板端运行效果预览 系统概述 自制引体、俯卧撑、仰卧起坐数据集&#xff0c;使用自制数据集训练yolo11-pose模型&#xff0c;通过ncnn进行模型转换&#xff0c;得…

【GAMES101笔记速查——Lecture 17 Materials and Appearances】

目录 1 材质和外观 1.1 自然界中&#xff0c;外观是光线和材质共同作用的结果 1.2 图形学中&#xff0c;什么是材质&#xff1f; 1.2.1 渲染方程严格正确&#xff0c;其中BRDF项决定了物体的材质 1.2.2 漫反射材质 &#xff08;1&#xff09;如何定义漫反射系数&#xff1…

数字图像处理:频率域滤波

数字图像处理&#xff1a;频率域滤波 笔者相关内容笔记&#xff1a; 1.傅里叶变换与图像处理 2.傅利叶变换在图像处理的应用 1.1 频率域滤波总体流程 1.2 DFT/IDFT DFT的例子 1.3 常见频率域滤波器 过滤高频信息&#xff0c;保留低频信息&#xff0c;则图像模糊 过滤…