17、通用对话框之 QFileDialog

Par @Martin dans le
Tags :

说明: 这些文章都是本人学习”devbean QT 学习之路2”的笔记, 部分内容摘自原文, 部分是自己的领悟.

QFileDialog 即文件对话框, 常见的就是打开文件和保存文件对话框:

实现代码如下:

void Qt_Notepad::OpenFile() {
    QString fileName = QFileDialog::getOpenFileName(this, "Open File", NULL, "file (*.*)");

    if (!fileName.isEmpty()) {
        QFile file;
        file.setFileName(fileName);
        if (file.open(QIODevice::ReadWrite)) {
            QTextStream in(&file);
            ui.textEdit->setText(in.readAll());
            file.close();
        }
    }
}

void Qt_Notepad::SaveFile() {
    QString fileName = QFileDialog::getSaveFileName(this, "Save File", "Untitled.txt");

    if (!fileName.isEmpty()) {
        QFile file;
        file.setFileName(fileName);
        if (file.open(QIODevice::ReadWrite)) {
            QTextStream out(&file);
            out << ui.textEdit->toPlainText(); //取纯文本
            file.close();
        }
    }
}


这两个函数中分别使用了 QFileDialog 的两个静态函数: getOpenFileName() 和 getSaveFileName();

先来看下 getOpenFileName() , 这个函数获取需要打开的文件的全路径.

QString getOpenFileName(QWidget * parent = 0,
                        const QString & caption = QString(),
                        const QString & dir = QString(),
                        const QString & filter = QString(),
                        QString * selectedFilter = 0,
                        Options options = 0)


  • parent: 父窗口.
  • caption: 对话框标题;
  • dir: 对话框打开时的默认目录, “.” 代表程序运行目录, “/” 代表当前盘符的根目录(特指 Windows 平台; Linux 平台当然就是根目录), 这个参数也可以是平台相关的, 比如”C:\“等;
  • filter: 过滤器. 我们使用文件对话框可以浏览很多类型的文件, 但是, 很多时候我们仅希望打开特定类型的文件. 比如, 文本编辑器希望打开文本文件, 图片浏览器希望打开图片文件. 过滤器就是用于过滤特定的后缀名. 如果我们使用”Image Files(.jpg .png)”, 则只能显示后缀名是 jpg 或者 png 的文件. 如果需要多个过滤器, 使用”;;”分割, 比如”JPEG Files(.jpg);;PNG Files(.png)”;
  • selectedFilter: 默认选择的过滤器;
  • options: 对话框的一些参数设定, 比如只显示文件夹等等, 它的取值是enum QFileDialog::Option, 每个选项可以使用 | 运算组合起来.
  • Qt_Notepad::OpenFile() 函数中我们先获取了文件的全路径, 然后判断下是否获取到了, 如果成功获取了文件路径, 就创建一个 QFile 对象,  然后将用户选择的文件路径传递给这个对象, 接下来使用 QFile::open() 打开文件, 参数是以何种方式打开. 打开成功则返回 true, 由此继续进行下面的操作, 使用 QTextStream::readAll() 读取文件所有内容, 然后将其赋值给 QTextEdit 显示出来. 最后不要忘记关闭文件.
  • Qt_Notepad::SaveFile() 函数也类似, 只不过最后一步, 我们使用 << 重定向, 将 QTextEdit 的内容输出到一个文件中. 关于文件操作, 我们会在后面的学习.

完整源码: http://yunpan.cn/cwdG4VIJd8c5V  访问密码 13dc