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. 功能完整性
- 系统性能监控
- 进程管理
- 网络监控
- 数据导出
学习要点
- Qt框架应用:Qt Widgets、Qt Charts、信号槽机制
- Windows API使用:系统信息获取、进程管理、性能监控
- C++编程实践:面向对象设计、内存管理、错误处理
- 界面设计:现代化UI设计、响应式布局
- 实时监控:定时器使用、数据采集、图表显示
源码下载
源代码下载链接:https://download.csdn.net/download/weixin_42059464/91718090
总结
本项目是一个功能完整、代码规范的教学级项目,适合学习Qt框架和Windows API开发。通过实际项目开发,可以深入理解Qt的信号槽机制、Windows API的使用方法,以及如何构建现代化的桌面应用程序。
项目采用模块化设计,代码结构清晰,注释详细,非常适合作为学习Qt和Windows开发的参考项目。