一、QFileDialog的介绍
QFileDialog 是 Qt 框架中提供的一个用于文件选择的标准对话框类,它允许用户在应用程序中选择文件或目录。它是跨平台的,在不同操作系统上会自动适配本地风格的文件对话框。
QFileDialog 提供以下主要功能:
- 打开单个文件
- 打开多个文件
- 选择目录
- 保存文件
- 文件过滤
- 设置默认目录和文件名
二、QFileDialog的常用静态方法
1. 获取打开的文件名
QString fileName = QFileDialog::getOpenFileName(nullptr,
"选择文件",
QDir::homePath(),
"图片文件 (*.png *.jpg);;所有文件 (*.*)");
if (!fileName.isEmpty()) {
qDebug() << "选中的文件:" << fileName;
}
参数说明:
- nullptr 代表父窗口,如果是 this,则表示当前窗口为父窗口。
- “选择文件” 是对话框的标题。
- QDir::homePath() 设置默认路径(这里是用户的主目录)。
- “图片文件 (.png .jpg);;所有文件 (.)” 是过滤器,用于限制可选文件类型。
2. 获取打开的多个文件名
QStringList fileNames = QFileDialog::getOpenFileNames(nullptr,
"选择多个文件",
QDir::homePath(),
"文本文件 (*.txt);;所有文件 (*.*)");
for (const QString &file : fileNames) {
qDebug() << "选中的文件:" << file;
}
返回的是 QStringList,可以遍历获取多个文件路径。
3. 获取保存的文件名
QString fileName = QFileDialog::getSaveFileName(nullptr, "保存文件", QDir::homePath() + "/untitled.txt", "文本文件 (*.txt);;所有文件 (*.*)");
if (!fileName.isEmpty()) {
QFile file(fileName);
if (file.open(QIODevice::WriteOnly)) {
QTextStream out(&file);
out << "Hello, QFileDialog!";
file.close();
}
}
如果用户选择了文件,则 getSaveFileName() 返回完整路径,程序可以基于此保存内容。
4.选择目录
QString dir = QFileDialog::getExistingDirectory(nullptr, "选择文件夹", QDir::homePath());
if (!dir.isEmpty()) {
qDebug() << "选中的文件夹:" << dir;
}
这个方法专门用于选择目录,而不是具体的文件。
三、完整示例
MainWindow::MainWindow(QWidget *parent)
: QWidget(parent)
{
setWindowTitle("QFileDialog类(文件对话框测试)");
// 创建控件
m_pFileNameLabel = new QLabel("文件名称:", this);
m_pFileNameLineEdit = new QLineEdit(this);
m_pFileButton = new QPushButton("选择...");
m_pFileSizeLabel = new QLabel("文件大小:", this);
m_pFileSizeLineEdit = new QLineEdit(this);
m_pGetFileButton = new QPushButton("获取文件大小信息", this);
// 排列布局
QGridLayout *gLayout = new QGridLayout(this);
gLayout->addWidget(m_pFileNameLabel, 0, 0);
gLayout->addWidget(m_pFileNameLineEdit, 0 ,1);
gLayout->addWidget(m_pFileButton, 0, 2);
gLayout->addWidget(m_pFileSizeLabel, 1, 0);
gLayout->addWidget(m_pFileSizeLineEdit, 1, 1, 1, 2);
gLayout->addWidget(m_pGetFileButton, 2, 0, 1, 3);
this->setLayout(gLayout);
connect(m_pFileButton, &QPushButton::clicked, this, &MainWindow::GetFileInfoFunc);
connect(m_pGetFileButton, &QPushButton::clicked, this, &MainWindow::GetFileSizeFunc);
}
void MainWindow::GetFileInfoFunc()
{
QString fileName = QFileDialog::getOpenFileName(nullptr,
"选择文件",
QDir::homePath(),
"图片文件 (*.png *.jpg);;所有文件 (*.*)");
m_pFileNameLineEdit->setText(fileName);
}
void MainWindow::GetFileSizeFunc()
{
QString strFileName = m_pFileNameLineEdit->text();
QFileInfo fileInfo(strFileName);
qint64 fileSize = fileInfo.size();
m_pFileSizeLineEdit->setText(QString::number(fileSize));
}