QFileSystemWatcher+QTableView监控目录下文件变化

目标

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

效果图

  • 监控目录下的 .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"

posted @ 2025-02-14 19:39  mohist  阅读(67)  评论(0)    收藏  举报