当前位置: 首页 > 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.dtcms.com/a/340606.html

相关文章:

  • Obsidian 1.9.10升级
  • 19.web api 10
  • SQL-leetcode— 2356. 每位教师所教授的科目种类的数量
  • 有关SWD 仿真和PA.15, PB3, PB4的冲突问题
  • 深入Linux内核:架构设计与核心功能解析
  • CSS3DRenderer+ CSS3DObject实现在 Three.js 中添加文本内容
  • 算法230. 二叉搜索树中第 K 小的元素
  • 10M25DCF484C8G Altera FPGA MAX10
  • 云原生俱乐部-RH294知识点归纳(1)
  • RK-Android11-PackageInstaller安装器自动安装功能实现
  • iOS App 混淆工具实战 医疗健康类 App 的安全与合规保护
  • 电脑驱动免费更新? 这款驱动管理工具:一键扫更新,还能备份恢复,小白也会用~
  • 【知识杂记】方差、标准差、均方误差、均方根误差与平均绝对误差,概念、计算公式、物理意义
  • 微型导轨的快速调平技术如何提升激光加工效率?
  • Python默认参数
  • CPTS--Administrator
  • 【clion】调试脚本并cmake构建Fargo项目win32版本
  • Spring Boot 配置
  • C++---向下取整(>>)与向零取整(/)
  • Vue2封装Axios
  • PyTorch - Developer Notes
  • 《录井工程与管理》——第二章井位勘测技术
  • 精品方案 | GCKontrol与OMNeT++联合仿真在机载网络性能分析中的应用
  • 基于单片机环境火灾安全检测
  • 驾驭复杂表单:用 RxJava 实现响应式表单处理
  • mysql-8.0.37-linux-glibc2.12-x86_64安装
  • 数据结构与算法系列(大白话模式)小学生起点(一)
  • 【Kafka】常见简单八股总结
  • 【39】OpenCV C++实战篇——直线拟合、直线测距、平行线段测距;(边缘检测,剔除噪点,轮廓检测,渐进概率霍夫直线)
  • ReAct Agent:让AI像人类一样思考与行动的革命性框架