Qt的getOpenFileName()函数使用
为了说明QFileDialog::getOpenFileName()函数的用法,首先要清楚函数的完整定义:
QString QFileDialog::getOpenFileName (
QWidget * parent = 0, // parent,用于指定父组件。
const QString & caption = QString(), // caption,是对话框的标题;
const QString & dir = QString(), //dir,是对话框显示时默认打开的目录
const QString & filter = QString(), // filter,是对话框的后缀名过滤器
QString * selectedFilter = 0, // selectedFilter,是默认选择的过滤器
Options options = 0 ) // options,是对话框的一些参数设定
第三个参数dir,是对话框显示时默认打开的目录,"." 代表程序运行目录,"/" 代表当前盘符的根目录(Windows,Linux下/就是根目录了),也可以是平台相关的,比如"C:\“等;例如我想打开程序运行目录下的Data文件夹作为默认打开路径,这里应该写成”./Data/",若想有一个默认选中的文件,则在目录后添加文件名即可:"./Data/teaser.graph"
第四个参数filter,是对话框的后缀名过滤器,比如我们使用"Image Files(.jpg .png)“就让它只能显示后缀名是jpg或者png的文件。如果需要使用多个过滤器,使用”;;“分割,比如"JPEG Files(.jpg);;PNG Files(.png)”;
第五个参数selectedFilter,是默认选择的过滤器;
第六个参数options,是对话框的一些参数设定,比如只显示文件夹等等,它的取值是enum QFileDialog::Option,每个选项可以使用 | 运算组合起来。
程序代码中的实际运用
/*
*第一个参数 this,指代父窗口为当前组件,并在当前父窗口下弹出一个子框口对话框
*第二个参数tr("文件选取"),用于指定弹出的对话框标题为"文件选取"
*第三个参数"C:",指定对话框显示时默认打开的目录是C盘
*第四个参数tr("文本文件(*txt)"),指文本过滤器
*/
QFileDialog::getOpenFileName(this, tr("文件选取"), "C:", tr("文本文件(*txt)"))
![具体效果如下](https://img-blog.csdnimg.cn/20210316142630694.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYW5kZXJfSA==,size_16,color_FFFFFF,t_70)
注:以上getOpenFileName()函数返回的应该是绝对路径,绝对路径是指文件在硬盘上真正存在的路径 即从盘符开始的路径,形如D:\DeskFace\组会.png
,总之,绝对路径很详细,但是在真正编程时,很少用绝对路径。因为组会.png
这个文件在本地电脑上的位置是在D:\
,但是其他电脑不一定有D:\
盘符,有可能是E盘或H盘
,导致报错,故我们一般采用相对路径,所谓相对路径,是从当前路径开始的路径 ,如绝对路径为C:\windows\system32\cmd.exe
,假如当前路径为C:\windows
,要描述上述路径,只需输入system32\cmd.exe
即可
具体代码实现:
// convertAbsolutePathToRelative()函数功能是将绝对路径转化为相对路径
QString selected_file_directory = convertAbsolutePathToRelative(QFileDialog::getOpenFileName(this, tr("文件选取"), "C:", tr("文本文件(*txt)")));
// convertAbsolutePathToRelative()函数具体实现如下
QString convertAbsolutePathToRelative(const QString& absolute_path)
{
QString current_path = QDir::currentPath(); // 当前路径,如 C:\windows的形式
QString tmp_str = absolute_path; // 绝对路径,如 C:\windows\system32\cmd.exe的形式
// if 语句首先判断绝对路径是否是以当前路径开头,以及绝对路径是否大于相对路径,如果满足条件,调用remove函数从绝对路径中剔除当前路径,剩下的即为相对路径,如 `system32\cmd.exe`
if (absolute_path.startsWith(current_path) && absolute_path.size() > current_path.size())
{
tmp_str.remove(0, current_path.size() + 1);
}
return tmp_str; // 返回相对路径
}