2012年(46)
分类: C/C++
2012-05-05 16:39:51
摘自:http://www.cnblogs.com/rophie/archive/2012/04/09/2439454.html
这节我们来通过实现文本编辑器的打开、保存和另存为菜单的功能来学习Qt中的标准对话框和文本文件的读写。
首先准备工作,先在头文件中声明三个槽函数,并且声明一个变量fileName来保存文件的路径
private slots:
void fileSave();
void fileSaveAs();
void fileOpen();
private:
QString fileName;
然后连接对应的信号槽。
当点击打开菜单的时候,会弹出一个打开文件对话框让用户选择要打开的文件,这个对话框就是Qt的标准内置对话框QFileDialog,QFileDialog是Qt中用于文件打开和保存的对话框。
修改MainWindow的fileOpen函数:
void MainWindow::fileOpen ()
{
QString fn = QFileDialog::getOpenFileName(this, tr("打开文件..."),".", tr("文本文件 (*.txt)"));
}
QFileDialog提供了很多静态函数,用于获取用户选择的文件。这里我们使用的是getOpenFileName(), 也就是“获取打开文件名”,你也可以查看API找到更多的函数使用。
第一个参数用于指定父组件。
第二个参数是对话框的标题;
第三个参数是对话框显示时默认打开的目录,"." 代表程序运行目录,"/" 代表当前盘符的根目录(Windows,Linux下/就是根目录了),也可以是平台相关的,比如"C:\\"等;
第四个参数是对话框的后缀名过滤器,比如我们使用"文本文件(*.txt)"就让它只能显示后缀名是txt的文件。如果需要使用多个过滤器,使用";;"分割,比如"JPEG Files(*.jpg);;PNG Files(*.png)"。
还有更多参数请参照API文档。
if (!fn.isEmpty())
{
if(QFile::exists (fn))
{
QFile file(fn);
if(file.open(QFile::ReadOnly))
{
fileName=fn;
QByteArray data=file.readAll ();
textEdit->setText (QObject::tr(data));
setWindowTitle (fileName+"-QNotepad");
}else{
QMessageBox::warning(this,tr("失败"),tr("打开文件失败!"));
}
}else{
QMessageBox::warning(this,tr("失败"),tr("文件不存在!"));
}
}
接下来先判断用户选择的文件路径是否为空,再检查目标文件是否存在。
QFile类是一个操作文件的输入/输出设备。QFile是用来读写二进制文件和文本文件的输入/输出设备。QFile可以自己单独被使用,但是如果和QTextStream一起使用将更加方便,后面会用到。
首先建立一个QFile对象file,并将刚刚取得的文件路径赋给它,调用open方法并且以只读方式打开文件,并将文件路径赋值给fileName。建立一个QByteArray类型的变量来储存readAll方法读取到的所有内容,并将文本显示在textEdit控件内,再设置当前窗口的标题为文件所在目录。
下面实现保存菜单的功能
void MainWindow::fileSave()
{
if(fileName.isEmpty ())
{
fileSaveAs ();
}else{
QFile file(fileName);
file.open (QFile::WriteOnly);
QTextStream out(&file);
out<
setWindowTitle (fileName+"-QNotepad");
}
}
首先我们判断文件路径是否为空,如果为空就说明是新建的文件,调用另存为方法。
QTextStream类提供了使用QIODevice读写文本的基本功能,QIODevice类是输入/输出设备的基类。文本流类的功能界面和标准的C++的iostream类非常相似。iostream和QTextStream的不同点是我们的流操作在一个很容易被继承的QIODevice上,而iostream只能操作一个不能被继承的FILE *指针。具体可查看API文档。
void MainWindow::fileSaveAs ()
{
QString fn = QFileDialog::getSaveFileName (this, tr("另存为..."), ".",tr("文本文件 (*.txt)"));
if (!fn.isEmpty()){
if(!fn.endsWith(".txt", Qt::CaseInsensitive)){
fileName=fn+".txt";
}else{
fileName=fn;
}
fileSave ();
}
}
我们可以使用getSaveFileName()来弹出一个保存对话框,具体参数和打开对话框很类似。接着判断文件是否有扩展名,如果没有就加上,设置fileName为用户选择的文件路径,然后再调用上面的fileSave方法。
这样我们的菜单就完成了!
作者:荒 木
出处:http://rophie.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利