Chinaunix首页 | 论坛 | 博客
  • 博客访问: 131025
  • 博文数量: 46
  • 博客积分: 571
  • 博客等级: 准尉
  • 技术积分: 290
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-26 23:57
文章分类

全部博文(46)

文章存档

2012年(46)

我的朋友

分类: C/C++

2012-05-05 16:39:51

C++ Qt 09:文本编辑器——文本文件的读写

摘自: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的标准内置对话框QFileDialogQFileDialogQt中用于文件打开和保存的对话框。

 

修改MainWindowfileOpen函数:

void MainWindow::fileOpen ()

{

QString fn = QFileDialog::getOpenFileName(this, tr("打开文件..."),".", tr("文本文件 (*.txt)"));

}

 

QFileDialog提供了很多静态函数,用于获取用户选择的文件。这里我们使用的是getOpenFileName(), 也就是获取打开文件名,你也可以查看API找到更多的函数使用。

 

第一个参数用于指定父组件。 

第二个参数是对话框的标题; 

第三个参数是对话框显示时默认打开的目录,"." 代表程序运行目录,"/" 代表当前盘符的根目录(WindowsLinux/就是根目录了),也可以是平台相关的,比如"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<toPlainText ();

    setWindowTitle (fileName+"-QNotepad");

    }

}

 

首先我们判断文件路径是否为空,如果为空就说明是新建的文件,调用另存为方法。

QTextStream类提供了使用QIODevice读写文本的基本功能,QIODevice类是输入/输出设备的基类。文本流类的功能界面和标准的C++iostream类非常相似。iostreamQTextStream的不同点是我们的流操作在一个很容易被继承的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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利

 

阅读(2017) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~