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

ops/2024/10/22 3:05:16/

效果展示

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.ppmy.cn/ops/127458.html

相关文章

大贤3D家谱-视图操作

在大贤家谱2025-3D中&#xff0c;您将体验到前所未有的家谱浏览方式。软件打破传统纸质家谱的局限&#xff0c;通过动态的三维展示&#xff0c;让信息更加直观且易于理解。 1. 自由浏览家谱​ 旋转、放大、缩小和平移&#xff1a;左键旋转&#xff0c;右键平移&#xff0c;滚…

知识点:代理设计模式

1.场景设定和问题复现 1 准备项目 pom.xml <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.3.1</version> <scope>test</scope></dependen…

医护人员排班|基于springBoot的医护人员排班系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息…

从 K8s 的 “临时容器” 看 K8s 设计的厉害之处

大家好&#xff0c;这里是G-LAB IT实验室。 ​ 从一个容器的不足说起 容器概念出现时&#xff0c;有个非常重要的理念&#xff1a;容器中极简。 即容器里面只保留需要运行的进程就可以&#xff0c;其他一律不要安装。这也是为什么 Docker 出现的那时&#xff0c;有一篇文章…

Windows PowerShell 有没有类似conda的虚拟环境功能?

PowerShell本身并不直接提供与Conda完全相同的环境功能&#xff0c;但PowerShell可以通过一些方法和工具来实现类似的环境管理。以下是对PowerShell和Conda环境功能的详细对比及PowerShell实现类似功能的途径&#xff1a; 一、Conda的环境功能 Conda是一个开源的包管理系统和…

Mac 编译 Unreal 源码版本

在Mac上编译Unreal Engine源码需要遵循以下步骤&#xff1a; 安装必要的依赖项&#xff1a; Xcode Python&#xff08;建议使用2.7版本&#xff09; Java&#xff08;使用JDK 8&#xff09; CMake Ninja SVN&#xff08;用于获取某些依赖项&#xff09; 获取Unreal Engi…

15分钟学Go 实战项目一:命令行工具

实战项目一&#xff1a;命令行工具 1. 引言 命令行工具是开发者常用的工具之一&#xff0c;它可以帮助用户通过命令行界面对程序进行控制和交互。在这节中&#xff0c;我们将创建一个简单的命令行工具&#xff0c;以帮助你理解Go语言的基本语法和如何处理命令行输入。在这个过…

数据库相关操作

1. 创建数据库 首先&#xff0c;使用 CREATE DATABASE 语句来创建一个新的数据库。 CREATE DATABASE my_database; 2. 使用数据库 创建数据库后&#xff0c;使用 USE 语句切换到这个数据库。 USE my_database; 3. 创建表 接下来&#xff0c;在数据库中创建一张表。表中…