概述:
QFileDialog,也就是文件对话框。在本节中,我们将尝试编写一个简单的文本文件编辑器,我们将使用 QFileDialog 来打开一个文本文件,并将修改过的文件保存到硬盘。
1,先实现一个简单的QMainWindow窗口
/*获取主菜单的地址*/
menubar1 = menuBar();
/*添加菜单第一种方法*/
/*fileOperation = menubar1 -> addMenu("文件");*/
/*添加菜单的第二种方法*/
fileOperation = new QMenu("文件");
menubar1->addMenu(fileOperation);
/*添加动作*/
OpenAction = fileOperation->addAction(QIcon(":/images/fileopen.png"),"打开");
SaveAction = fileOperation->addAction(QIcon(":/images/filesave.png"),"保存");
/*创建一个工具栏并且添加动作*/
QToolBar *toolBar = addToolBar(tr("&File"));
toolBar->addAction(OpenAction);
toolBar->addAction(SaveAction);
/*创建文本编辑区并且设置为中心控件,将一个组件作为窗口的中心组件,放在窗口中央显示区。*/
textedit = new QTextEdit(this);
setCentralWidget(textedit);
/*链接信号*/
connect(OpenAction, &QAction::triggered,this, &MainWindow::openFile);
connect(SaveAction, &QAction::triggered,this, &MainWindow::saveFile);
我们在菜单和工具栏添加了两个动作:打开和保存。使用 QTextEdit 类,这个类用于显示富文本文件。也就是说,它不仅仅用于显示文本,还可以显示图片、表格等等。不过,我们现在只用它显示纯文本文件。
我们使用 connect()函数,为这两个 QAction 对象添加响应的动作。
实现对应的槽函数:
打开文件
void MainWindow::openFile()
{
/*得到打开文件的路径*/
QString path = QFileDialog::getOpenFileName(this, tr("Open File"), ".", tr("Text Files(*.txt)"));
/*判断文件路径是否为空*/
if(!path.isEmpty())
{
/*打开刚刚获取的路径所在文件*/
QFile file(path);
/*判断文件操作权限*/
if (!file.open(QIODevice::ReadOnly ))
{
/*如果是只读则警告不能打开此路径的文件,并且推出函数*/
QMessageBox::warning(this, tr("Read File"),tr("Cannot open file:\n%1").arg(path));
return;
}
/*数据流的方式写入中心控件当中*/
QTextStream in(&file);
textedit->setText(in.readAll());
/*关闭文件*/
file.close();
}
else
{
/*差生一个黄色标号的对话框提示没有选择文件*/
QMessageBox::warning(this, tr("提示"),tr("你没有选择文件!"));
}
}
**保存文件**
void MainWindow::saveFile()
{
/*得到打开文件的路径*/
QString path = QFileDialog::getSaveFileName(this, tr("保存文件"), ".", tr("Text Files(*.txt)"));
/*判断文件路径是否为空*/
if(!path.isEmpty())
{
QFile file(path);
if (!file.open(QIODevice::WriteOnly))
{
QMessageBox::warning(this, tr("保存文件"),tr("无法保存文件:\n%1").arg(path));
return;
}
QTextStream out(&file);
out << textedit->toPlainText();
file.close();
}
else
{
QMessageBox::warning(this, tr("提示"),tr("你没有保存文件"));
}
}
在 openFile()函数中,我们使用 QFileDialog::getOpenFileName()来获取需要打开的文件的路径。这个函数原型如下:
QString getOpenFileName(QWidget * parent = 0,const QString & caption = QString(), const QString & dir = QString(), const QString & filter = QString(), QString * selectedFilter = 0, Options options = 0)
/*参数说明*/
/*
1,parent:父窗口。Qt 的标准对话框提供静态函数,用于返回一个模态对话框;
2,caption:对话框标题;
3,dir:对话框打开时的默认目录“.” 代表程序运行目录,“/” 代表当前盘符的根目录(特指 Windows 平台;Linux 平台当然就是根目录),这个参数也可以是平台相关的,比如“C:\\”等;
4,filter:过滤器。
我们使用文件对话框可以浏览很多类型的文件,但是,很多时候我们仅希望打开特定类型的文件。比如,文本编辑器希望打开文本文件,图片浏览器希望打开图片文件。过滤器就是用于过滤特定的后缀名。如果我们使用“Image Files(*.jpg *.png)”,则只能显示后缀名是 jpg 或者 png 的文件。如果需要多个过滤器, 使用“ ;; ” 分割, 比如“ JPEG Files(*.jpg);;PNG Files(*.png)”;
5,selectedFilter:默认选择的过滤器;
6,options:对话框的一些参数设定
比如只显示文件夹等等,它的取值是 enum QFileDialog::Option,每个选项可以使用 | 运算组合起来。
*/
QFileDialog::getOpenFileName()返回值是选择的文件路径。我们将其赋值给path。通过判断 path 是否为空,可以确定用户是否选择了某一文件。只有当用户选择了一个文件时,我们才执行下面的操作。
在 saveFile()中使用的 QFileDialog::getSaveFileName()也是类似的。使用这种静态函数,在 Windows、Mac OS 上面都是直接调用本地对话框,但是 Linux 上则是 QFileDialog 自己的模拟。这暗示了,如果你不使用这些静态函数,而是直接使用 QFileDialog 进行设置,那么得到的对话框很可能与系统对话框的外观不一致。这一点是需要注意的。