当前位置: 首页 > news >正文

Qt5.9.9 + Windows API 开发系统监控工具 - 教学级项目实战

Qt5.9.9 + Windows API 开发系统监控工具 - 教学级项目实战

项目概述

项目主题

基于Qt5.9.9框架和Windows API开发的Windows系统监控工具,实现实时系统性能监控、进程管理、网络监控等功能。项目采用与Windows任务管理器相同的CPU使用率计算算法,确保数据准确性。

项目描述

本项目是一个功能完整的系统监控工具,具有以下特点:

  • 实时监控:CPU、内存、磁盘使用率的实时监控
  • 可视化图表:使用Qt Charts实现动态趋势图
  • 进程管理:完整的进程列表和进程控制功能
  • 现代化界面:扁平化设计,响应式布局
  • 教学价值:适合学习Qt框架和Windows API开发

源代码下载链接:https://download.csdn.net/download/weixin_42059464/91718090

技术栈

  • 开发框架:Qt 5.9.9
  • 编程语言:C++11
  • 编译器:MinGW32
  • 操作系统:Windows 10
  • 核心模块:Qt Widgets, Qt Charts, Qt Core, Qt Gui, Qt Network
  • 系统API:Windows API, GetSystemTimes, GlobalMemoryStatusEx, PSAPI

项目结构

15_SystemMonitoringTool/
├── 15_SystemMonitoringTool.pro    # Qt项目文件
├── main.cpp                        # 主程序入口
├── mainwindow.h                    # 主窗口头文件
├── mainwindow.cpp                  # 主窗口实现
├── systeminfo.h                    # 系统信息类头文件
├── systeminfo.cpp                  # 系统信息类实现
├── processmanager.h                # 进程管理类头文件
├── processmanager.cpp              # 进程管理类实现
├── performancemonitor.h            # 性能监控类头文件
├── performancemonitor.cpp          # 性能监控类实现
├── networkmonitor.h                # 网络监控类头文件
├── networkmonitor.cpp              # 网络监控类实现
└── README.md                       # 项目说明文档

核心功能实现

1. 界面设计

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

主窗口布局

采用QTabWidget实现多标签页界面,包含5个功能模块:

// mainwindow.cpp - 主窗口初始化
void MainWindow::setupUI()
{// 创建标签页QTabWidget *tabWidget = new QTabWidget(this);// 添加各功能标签页tabWidget->addTab(createOverviewTab(), "📊 概览");tabWidget->addTab(createPerformanceTab(), "📈 性能监控");tabWidget->addTab(createProcessTab(), "⚙️ 进程管理");tabWidget->addTab(createSystemInfoTab(), "💻 系统信息");tabWidget->addTab(createNetworkTab(), "🌐 网络监控");setCentralWidget(tabWidget);
}
现代化样式设计

使用Qt Stylesheets实现扁平化界面:

// 应用现代化样式
QString style = R"(QMainWindow {background-color: #f5f5f5;}QTabWidget::pane {border: 1px solid #d0d0d0;background-color: white;border-radius: 8px;}QTabBar::tab {background-color: #e8e8e8;padding: 8px 16px;margin-right: 2px;border-radius: 4px;}QTabBar::tab:selected {background-color: #0078d4;color: white;}QPushButton {background-color: #0078d4;color: white;border: none;padding: 8px 16px;border-radius: 4px;}QPushButton:hover {background-color: #106ebe;}
)";
setStyleSheet(style);

2. 信号槽机制

性能监控信号槽

使用Qt信号槽机制实现数据更新和界面刷新:

// performancemonitor.h - 信号定义
class PerformanceMonitor : public QObject
{Q_OBJECTsignals:void dataUpdated(const PerformanceData &data);void monitoringStarted();void monitoringStopped();private slots:void updateData();
};// mainwindow.cpp - 信号槽连接
void MainWindow::setupConnections()
{// 连接性能监控信号connect(performanceMonitor, &PerformanceMonitor::dataUpdated,this, &MainWindow::updatePerformanceData);// 连接进程管理信号connect(processManager, &ProcessManager::processListUpdated,this, &MainWindow::updateProcessList);// 连接网络监控信号connect(networkMonitor, &NetworkMonitor::networkDataUpdated,this, &MainWindow::updateNetworkInfo);
}

3. CPU使用率计算算法

任务管理器算法实现

采用与Windows任务管理器完全相同的GetSystemTimes算法:

// performancemonitor.cpp - CPU使用率计算
void PerformanceMonitor::updateData()
{PerformanceData data;data.timestamp = QDateTime::currentDateTime();// ===== CPU使用率计算(任务管理器算法) =====FILETIME idleTime, kernelTime, userTime;if (GetSystemTimes(&idleTime, &kernelTime, &userTime)) {static FILETIME lastIdleTime = {0}, lastKernelTime = {0}, lastUserTime = {0};static bool firstCall = true;if (!firstCall) {// 转换为64位整数进行计算ULARGE_INTEGER idle, kernel, user;ULARGE_INTEGER lastIdle, lastKernel, lastUser;idle.LowPart = idleTime.dwLowDateTime;idle.HighPart = idleTime.dwHighDateTime;kernel.LowPart = kernelTime.dwLowDateTime;kernel.HighPart = kernelTime.dwHighDateTime;user.LowPart = userTime.dwLowDateTime;user.HighPart = userTime.dwHighDateTime;lastIdle.LowPart = lastIdleTime.dwLowDateTime;lastIdle.HighPart = lastIdleTime.dwHighDateTime;lastKernel.LowPart = lastKernelTime.dwLowDateTime;lastKernel.HighPart = lastKernelTime.dwHighDateTime;lastUser.LowPart = lastUserTime.dwLowDateTime;lastUser.HighPart = lastUserTime.dwHighDateTime;// 核心算法:计算时间差值ULONGLONG kernelDiff = kernel.QuadPart - lastKernel.QuadPart;ULONGLONG userDiff = user.QuadPart - lastUser.QuadPart;ULONGLONG idleDiff = idle.QuadPart - lastIdle.QuadPart;ULONGLONG totalDiff = kernelDiff + userDiff;if (totalDiff > 0) {// CPU使用率计算公式:使用时间 / 总时间 * 100data.cpuUsage = 100.0 - ((double)idleDiff * 100.0 / totalDiff);// 数据范围限制if (data.cpuUsage < 0.0) data.cpuUsage = 0.0;if (data.cpuUsage > 100.0) data.cpuUsage = 100.0;} else {data.cpuUsage = 0.0;}} else {// 首次调用,初始化基准值data.cpuUsage = 0.0;firstCall = false;}// 保存当前值作为下次计算的基准lastIdleTime = idleTime;lastKernelTime = kernelTime;lastUserTime = userTime;}// 更新历史数据并发送信号historyData.append(data);if (historyData.size() > maxHistoryPoints) {historyData.removeFirst();}lastData = data;emit dataUpdated(data);
}

4. 实时图表显示

Qt Charts集成

使用Qt Charts模块实现动态趋势图:

// mainwindow.cpp - 图表初始化
void MainWindow::setupCharts()
{// CPU使用率图表QChart *cpuChart = new QChart();cpuSeries = new QLineSeries();cpuChart->addSeries(cpuSeries);cpuChart->setTitle("CPU使用率趋势");// 设置坐标轴QValueAxis *cpuAxisY = new QValueAxis();cpuAxisY->setRange(0, 100);cpuAxisY->setTitleText("使用率 (%)");QDateTimeAxis *cpuAxisX = new QDateTimeAxis();cpuAxisX->setFormat("hh:mm:ss");cpuAxisX->setTitleText("时间");cpuChart->addAxis(cpuAxisY, Qt::AlignLeft);cpuChart->addAxis(cpuAxisX, Qt::AlignBottom);cpuSeries->attachAxis(cpuAxisY);cpuSeries->attachAxis(cpuAxisX);// 创建图表视图QChartView *cpuChartView = new QChartView(cpuChart);cpuChartView->setRenderHint(QPainter::Antialiasing);// 内存使用率图表(类似实现)// ...
}
动态数据更新

实现图表的实时滚动显示:

// mainwindow.cpp - 图表数据更新
void MainWindow::updatePerformanceData()
{PerformanceData data = performanceMonitor->getCurrentData();// 更新CPU图表if (!qIsNaN(data.cpuUsage) && !qIsInf(data.cpuUsage) && data.cpuUsage >= 0 && data.cpuUsage <= 100) {cpuSeries->append(data.timestamp.toMSecsSinceEpoch(), data.cpuUsage);// 动态调整X轴范围,显示最近60秒的数据if (cpuSeries->count() > 1) {qint64 minTime = cpuSeries->at(0).x();qint64 maxTime = cpuSeries->at(cpuSeries->count() - 1).x();if (minTime > 0 && maxTime > 0 && maxTime > minTime) {cpuAxisX->setRange(QDateTime::fromMSecsSinceEpoch(minTime),QDateTime::fromMSecsSinceEpoch(maxTime));}}}// 更新UI显示cpuUsageLabel->setText(QString("CPU使用率: %1%").arg(data.cpuUsage, 0, 'f', 1));cpuProgressBar->setValue(static_cast<int>(data.cpuUsage));
}

5. 进程管理功能

进程枚举和获取

使用Windows API获取系统进程信息:

// processmanager.cpp - 进程列表获取
QList<ProcessInfo> ProcessManager::getProcessList()
{QList<ProcessInfo> processList;// 创建进程快照HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (hSnapshot == INVALID_HANDLE_VALUE) {return processList;}PROCESSENTRY32W pe32;pe32.dwSize = sizeof(PROCESSENTRY32W);// 枚举进程if (Process32FirstW(hSnapshot, &pe32)) {do {ProcessInfo info;info.processId = pe32.th32ProcessID;info.processName = QString::fromWCharArray(pe32.szExeFile);info.threadCount = pe32.cntThreads;info.priority = pe32.pcPriClassBase;// 获取进程内存使用情况HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pe32.th32ProcessID);if (hProcess) {PROCESS_MEMORY_COUNTERS pmc;if (GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc))) {info.memoryUsage = static_cast<qint64>(pmc.WorkingSetSize);}CloseHandle(hProcess);}processList.append(info);} while (Process32NextW(hSnapshot, &pe32));}CloseHandle(hSnapshot);return processList;
}

6. 系统信息获取

硬件信息获取

使用Windows API获取系统硬件信息:

// systeminfo.cpp - 系统信息获取
QString SystemInfo::getCPUName()
{QString cpuName;// 获取CPU信息int cpuInfo[4] = {0};__cpuid(cpuInfo, 0x80000002);char brand[0x40];memset(brand, 0, sizeof(brand));for (int i = 0; i < 4; i++) {memcpy(brand + i * 4, &cpuInfo[i], sizeof(int));}__cpuid(cpuInfo, 0x80000003);for (int i = 0; i < 4; i++) {memcpy(brand + 16 + i * 4, &cpuInfo[i], sizeof(int));}__cpuid(cpuInfo, 0x80000004);for (int i = 0; i < 4; i++) {memcpy(brand + 32 + i * 4, &cpuInfo[i], sizeof(int));}cpuName = QString::fromLocal8Bit(brand).trimmed();return cpuName;
}qint64 SystemInfo::getTotalMemory()
{MEMORYSTATUSEX memInfo;memInfo.dwLength = sizeof(MEMORYSTATUSEX);if (GlobalMemoryStatusEx(&memInfo)) {return static_cast<qint64>(memInfo.ullTotalPhys);}return 0;
}

7. 数据导出功能

CSV格式导出

实现监控数据的CSV格式导出:

// mainwindow.cpp - 数据导出
void MainWindow::exportData()
{QString fileName = QFileDialog::getSaveFileName(this, "导出性能数据", "", "CSV文件 (*.csv)");if (fileName.isEmpty()) {return;}QFile file(fileName);if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {QMessageBox::warning(this, "错误", "无法创建文件");return;}QTextStream out(&file);out.setCodec("UTF-8");// 写入CSV头部out << "时间戳,CPU使用率(%),内存使用率(%),磁盘使用率(%)\n";// 获取历史数据QList<PerformanceData> historyData = performanceMonitor->getHistoryData();// 写入数据for (const PerformanceData &data : historyData) {out << data.timestamp.toString("yyyy-MM-dd hh:mm:ss") << ","<< QString::number(data.cpuUsage, 'f', 2) << ","<< QString::number(data.memoryUsage, 'f', 2) << ","<< QString::number(data.diskUsage, 'f', 2) << "\n";}file.close();QMessageBox::information(this, "成功", "数据导出完成");
}

项目特色

1. 算法准确性

  • CPU使用率计算采用与Windows任务管理器完全相同的算法
  • 确保监控数据的准确性和一致性

2. 现代化界面

  • 扁平化设计风格
  • 响应式布局
  • emoji图标装饰
  • 实时动态图表

3. 教学价值

  • 完整的Qt框架应用示例
  • Windows API实际应用
  • 面向对象设计实践
  • 信号槽机制演示

4. 功能完整性

  • 系统性能监控
  • 进程管理
  • 网络监控
  • 数据导出

学习要点

  1. Qt框架应用:Qt Widgets、Qt Charts、信号槽机制
  2. Windows API使用:系统信息获取、进程管理、性能监控
  3. C++编程实践:面向对象设计、内存管理、错误处理
  4. 界面设计:现代化UI设计、响应式布局
  5. 实时监控:定时器使用、数据采集、图表显示

源码下载

源代码下载链接:https://download.csdn.net/download/weixin_42059464/91718090

总结

本项目是一个功能完整、代码规范的教学级项目,适合学习Qt框架和Windows API开发。通过实际项目开发,可以深入理解Qt的信号槽机制、Windows API的使用方法,以及如何构建现代化的桌面应用程序。

项目采用模块化设计,代码结构清晰,注释详细,非常适合作为学习Qt和Windows开发的参考项目。

http://www.xdnf.cn/news/1333261.html

相关文章:

  • 项目各功能介绍
  • linux下MySQL安装与卸载
  • Tomcat 性能优化终极指南
  • 餐饮灶头:后厨效率与菜品稳定的核心载体
  • Linux《进程间通信(下)》
  • 海量数据测试指南与实战
  • 【PostgreSQL内核学习:WindowAgg 节点对 Tuplestore 的复用机制】
  • 超大型公共场所的智慧守护者——人脸动态识别与管理系统
  • Temu美国站大规模扫号封店:虚假本土店遭批量封禁,如何规避?
  • 心路历程-了解网络相关知识
  • 【C2000常见问题】当板子处于强电噪声环境下,或带重载时C2000芯片的PWM发波会出现异常,导致炸管。
  • Vue2封装Axios
  • 8.20网络编程——sqlite3数据库
  • LeetCode 刷题【47. 全排列 II】
  • 【Linux系统】匿名管道以及进程池的简单实现
  • 在 React 中,​父子组件之间的通信(传参和传方法)
  • 大语言模型研究进展
  • Elasticsearch 写入全链路:从单机到集群
  • sfc_os!SfcValidateCatalogs函数分析之syssetup.inf中的[ProductCatalogsToInstall]
  • ansible playbook 实战案例roles | 实现基于 IHS 的 AWStats 访问监控系统
  • 第R6周:LSTM实现糖尿病探索与预测
  • [特殊字符] 小豆包 API 聚合平台:让 AI 接入更简单、更高效
  • 【数据结构之二叉树】
  • 【0基础PS】图片格式
  • Java常用类:编程世界的瑞士军刀
  • Web网站的运行原理1
  • JAVA:MyBatis 核心组件详解的技术指南
  • Mac电脑 Pixelmator Pro 专业图像处理【媲美PS】
  • 基于FPGA的实时图像处理系统(2)——VGA显示彩条和图片
  • 简笔成画:让AI绘画变得简单而有趣