QT中利用QTreeWidget显示文件夹中的所有子文件夹和文件,并全部设置复选框和信号槽执行函数,请给我完整代码
时间: 2024-02-03 21:12:34 浏览: 174
以下是一个简单的实现,其中使用了递归函数来遍历文件夹中的所有子文件夹和文件,并将它们添加到QTreeWidget中。每个文件夹和文件都设置了复选框,并且可以通过信号槽来执行自定义函数。
```cpp
#include <QApplication>
#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <QDir>
class FileTreeWidget : public QTreeWidget {
Q_OBJECT
public:
explicit FileTreeWidget(QWidget *parent = nullptr) : QTreeWidget(parent) {
QStringList headers;
headers << "Name" << "Path";
setHeaderLabels(headers);
setSelectionMode(QAbstractItemView::ExtendedSelection);
connect(this, &QTreeWidget::itemChanged, this, &FileTreeWidget::itemChecked);
}
public slots:
void itemChecked(QTreeWidgetItem *item, int column) {
if (item->checkState(column) == Qt::Checked) {
QString filePath = item->data(1, Qt::UserRole).toString();
// Do something with the file path
qDebug() << "Selected: " << filePath;
} else {
// Do something when unchecked
}
}
public:
void addFolder(QString path, QTreeWidgetItem *parentItem = nullptr) {
QDir dir(path);
QTreeWidgetItem *folderItem = new QTreeWidgetItem(parentItem);
folderItem->setText(0, dir.dirName());
folderItem->setData(1, Qt::UserRole, dir.absolutePath());
folderItem->setFlags(folderItem->flags() | Qt::ItemIsUserCheckable);
folderItem->setCheckState(0, Qt::Unchecked);
QFileInfoList fileInfoList = dir.entryInfoList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot);
for (int i = 0; i < fileInfoList.size(); ++i) {
QFileInfo fileInfo = fileInfoList.at(i);
if (fileInfo.isDir()) {
addFolder(fileInfo.absoluteFilePath(), folderItem);
} else {
QTreeWidgetItem *fileItem = new QTreeWidgetItem(folderItem);
fileItem->setText(0, fileInfo.fileName());
fileItem->setData(1, Qt::UserRole, fileInfo.absoluteFilePath());
fileItem->setFlags(fileItem->flags() | Qt::ItemIsUserCheckable);
fileItem->setCheckState(0, Qt::Unchecked);
}
}
expandItem(folderItem);
}
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
FileTreeWidget treeWidget;
treeWidget.addFolder("/path/to/folder");
treeWidget.show();
return app.exec();
}
#include "main.moc"
```
在这个例子中,我们创建了一个名为FileTreeWidget的类,它继承自QTreeWidget,并在其中定义了三个函数:构造函数、itemChecked槽函数和addFolder函数。
构造函数中设置了树控件的标题和选择模式,并连接了itemChanged信号到itemChecked槽函数。
itemChecked槽函数在复选框状态改变时被触发,并从QTreeWidgetItem中获取文件路径。在这个例子中,我们只是简单地打印了文件路径,但你可以在此处执行自定义代码。
addFolder函数是一个递归函数,用于遍历文件夹中的所有子文件夹和文件,并将它们添加到QTreeWidget中。对于每个文件夹和文件,我们都创建一个QTreeWidgetItem,并将其添加到父级QTreeWidgetItem中。我们还设置了复选框和文件路径数据。
最后,我们在main函数中创建了FileTreeWidget对象,并使用addFolder函数添加了文件夹中的所有子文件夹和文件。最后,我们显示了树控件并启动了应用程序。
阅读全文