目标
- 监控目录下的指定类型的文件,显示文件的序号、名称以及大小。
- 目录下的文件变化时(删除文件,新增文件后),程序界面可以实时显示目录下的状态。
效果图
- 监控目录下的
.h 文件

完整源码
#include <QApplication>
#include <QTableView>
#include <QFileSystemWatcher>
#include <QStandardItemModel>
#include <QDir>
#include <QVBoxLayout>
#include <QWidget>
#include <QDebug>
#include <QHeaderView>
class MainWindow : public QWidget
{
Q_OBJECT
public:
MainWindow(QWidget* parent = nullptr) : QWidget(parent)
{
// 设置布局
QVBoxLayout* layout = new QVBoxLayout(this);
// 创建 QTableView
tableView = new QTableView(this);
// 创建数据模型(3列:序号、文件名、文件大小)
model = new QStandardItemModel(this);
model->setColumnCount(3);
model->setHeaderData(0, Qt::Horizontal, "Index");
model->setHeaderData(1, Qt::Horizontal, "File Name");
model->setHeaderData(2, Qt::Horizontal, "File Size");
// 设置模型
tableView->setModel(model);
// 设置列宽
tableView->setColumnWidth(0, 50); // 序号列
tableView->setColumnWidth(1, 250); // 文件名列
tableView->setColumnWidth(2, 100); // 文件大小列
// 隐藏行头(行号)
tableView->verticalHeader()->setVisible(false);
// 创建 QFileSystemWatcher
fileWatcher = new QFileSystemWatcher(this);
// 设置监控目录
directory = QApplication::applicationDirPath(); // 监控当前目录
fileWatcher->addPath(directory);
// 初始加载文件列表
loadFileList();
// 连接信号槽,当目录变化时刷新文件列表
connect(fileWatcher, &QFileSystemWatcher::directoryChanged, this, &MainWindow::refreshFileList);
// 将 QTableView 添加到布局
layout->addWidget(tableView);
setLayout(layout);
}
private:
// 加载文件列表
void loadFileList()
{
QDir dir(directory);
QStringList filters;
filters << "*.h"; // 只监控 .h 文件
QStringList fileList = dir.entryList(filters, QDir::Files | QDir::NoDotAndDotDot);
model->removeRows(0, model->rowCount()); // 清空现有数据
int row = 0;
for (const QString& fileName : fileList)
{
QFileInfo fileInfo(dir.filePath(fileName));
// 创建三列的数据项
QList<QStandardItem*> rowItems;
rowItems << new QStandardItem(QString::number(row + 1)); // 序号(从1开始)
rowItems << new QStandardItem(fileName); // 文件名
rowItems << new QStandardItem(QString::number(fileInfo.size())); // 文件大小
model->appendRow(rowItems);
row++;
}
}
// 刷新文件列表
void refreshFileList()
{
qDebug() << "Directory changed, refreshing file list...";
loadFileList(); // 重新加载文件列表
}
private:
QTableView* tableView;
QStandardItemModel* model;
QFileSystemWatcher* fileWatcher;
QString directory; // 监控的目录
};
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
MainWindow window;
window.setWindowTitle(".h File Monitor with Index");
window.resize(1000, 800);
window.show();
return app.exec();
}
#include "main.moc"