`

Qt的文本文件读写

    博客分类:
  • Qt
 
阅读更多
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <boost/scoped_ptr.hpp>
using namespace boost;


class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void readFile(const QString& fileName);
    void writeFile(const QString& fileName);
public slots:
    void open();
    void save();
    void saveAs();
    void close();
    void quit();
protected:
    void dragEnterEvent(QDragEnterEvent *);
    void dropEvent(QDropEvent *);
private:
    class MainWindowUi;
    scoped_ptr<MainWindowUi> mui;
    class MainWindowData;
    scoped_ptr<MainWindowData> mData;
};

#endif // MAINWINDOW_H



mainwindow.cpp
#include <QFileDialog>
#include <QString>
#include <QTextStream>
#include <QCloseEvent>
#include <QDesktopWidget>
#include <QUrl>
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <iostream>
using namespace std;

class MainWindow::MainWindowData{
public:
    QString mFileName;
    QString mText;
    QFile mFile;
    QTextStream mStream;
};

class MainWindow::MainWindowUi:public Ui::MainWindow{
public:
    QFileDialog* mFileDialog;
public:
    MainWindowUi(){

    }
};

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    mui.reset(new MainWindowUi);
    mui->setupUi(this);
    mData.reset(new MainWindowData);
    mui->mFileDialog = new QFileDialog(this);
    mui->textEdit->setAcceptDrops(false);
    setAcceptDrops(true);
    //把所有action与对应的槽相连
    connect(mui->action_open, SIGNAL(triggered()), this, SLOT(open()));
    connect(mui->action_save, SIGNAL(triggered()), this ,SLOT(save()));
    connect(mui->actionSave_As, SIGNAL(triggered()), this ,SLOT(saveAs()));
    connect(mui->action_close,SIGNAL(triggered()), this, SLOT(close()));
    connect(mui->action_quit, SIGNAL(triggered()), this, SLOT(quit()));
    //放到屏幕中间
    int screenCenterX =(QDesktopWidget().screenGeometry().width()-geometry().width())/2;
    int screenCenterY =(QDesktopWidget().screenGeometry().height()-geometry().height())/2;
    //宽和高就用设计器中设置的吧
    setGeometry(screenCenterX,screenCenterY,width(),height());
}

/*
  根据文件名读文本文件
*/
void MainWindow::readFile(const QString &fileName){
    mData->mFile.setFileName(fileName);
    if(!mData->mFile.open(QIODevice::ReadOnly|QIODevice::Text))
        return;
    //怕文件太大,一行一行地读
    mData->mStream.setDevice(&mData->mFile);
    QString line = mData->mStream.readLine();
    while(not line.isNull()){
        mData->mText.append(line).append("\n");
        line = mData->mStream.readLine();
    }
    //读完得关了它,最好一开始就写上,我在测试writeFile能否读text时没写后面的代码,
    //结果一关程序就把我的源码清空了2个才发现,悲剧啊...
    mData->mFile.close();
    mui->textEdit->clear();
    mui->textEdit->setText(mData->mText);
}

/*
  根据文件名写文本文件
*/
void MainWindow::writeFile(const QString &fileName){
    mData->mFile.setFileName(fileName);
    if(not mData->mFile.open(QIODevice::WriteOnly|QIODevice::Truncate))
        return;//can not write
    mData->mStream.setDevice(&mData->mFile);
    QStringList currentTextList = mui->textEdit->toPlainText().split("\n");
    foreach(QString str,currentTextList){
        mData->mStream << str << "\n";
    }
    mData->mFile.close();
}

void MainWindow::open(){
    mData->mFileName = mui->mFileDialog->getOpenFileName(this,tr("Open File"),//这个对话框的标题
                                                    "/home/xiangjie/code/unix/T1/",
                                                    tr("files(*.c *.cc *.cpp *.txt)"));//这里相当于是过滤器
    readFile(mData->mFileName);
}

/*
  保存
  */
void MainWindow::save(){
    if(mData->mFileName.isNull())
        return;
    writeFile(mData->mFileName);
}

/*
  另存为
  */
void MainWindow::saveAs(){
    mData->mFileName = mui->mFileDialog->getSaveFileName(this,tr("Save File"),
                                                         "/home/xiangjie/code",
                                                         tr("files(*.c *.cc *.cpp *.txt)"));
    save();
}

/*
  清空textEdit和fileName
 */
void MainWindow::close(){
    mui->textEdit->clear();
    mData->mFileName.clear();
}

/*
  关闭所有窗口
*/
void MainWindow::quit(){
    qApp->closeAllWindows();
}

/*
 拖放
 */
void MainWindow::dragEnterEvent(QDragEnterEvent *event){
    if(event->mimeData()->hasFormat("text/uri-list"))
        event->acceptProposedAction();
}

void MainWindow::dropEvent(QDropEvent *event){
    QList<QUrl> urls = event->mimeData()->urls();
    if(urls.isEmpty())
        return;
    QString fileName = urls.first().toLocalFile();
    if(fileName.isEmpty())
        return;
    readFile(fileName);
    setWindowTitle(tr("%1-%2").arg(fileName).arg(tr("Drag file")));
}

MainWindow::~MainWindow()
{
}




main.cpp
#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}







  • 大小: 64.3 KB
  • 大小: 95.5 KB
分享到:
评论

相关推荐

    QT文本文件读写应用程序示例

    Qt提供了两种读写纯文本文件的基本方法,一种是用QFile类的IODevice读写功能直接进行读写,另一种是利用QFile和QTextStream结合起来,用流(Stream)的方法进行文件读写。 实例samp7_1演示了这两种方法读写文本文件...

    使用qt对中文文本进行读写并显示在主窗口视图中

    使用qt对中文文本进行读写并显示在主窗口视图中,提供逐行读写和一次读完两种选择

    Qt多线程读写大型文本文件项目

    2.读取文本文件,显示到桌面控件中; 3.读取的文件使用多线程处理,不影响显示界面正常操作; 4.读取过来的文件如有修改,需要保存修改部分; 5.读、写文件需要显示处理进度; 6.增加一个列表,用于展示文本文件的...

    qt 中文写入文本文件

    qt 在读写中文的时候经常会出现乱码格式,这是令人很头痛的一件事,文件中程序经过真机测试是正常显示了,大家如果有这样的问题后不妨参考一下,希望对你有帮助, 同时希望你能把开源的东西共享给大家

    QT4文本文件保存打开例程源代码

    QT4最基本的文本文件保存与读取例程源代码,学习最基本的QFileDialog的使用,txt文件的读写.

    QT二进制文件读写应用程序示例

    除了文本文件之外,其他需要按照一定的格式定义读写的文件都称为二进制文件。每种格式的二进制文件都有自己的格式定义,写入数据时按照一定的顺序写入,读出时也按照相应的顺序读出。例如地球物理中常用的SEG-Y格式...

    QT4.7_文件读写另存为操作

    使用QFileDialog 和 QFile 以及 TextEdit 实现的文本操作 这个界面实现的就是按一个BUTTON键打开文档,并且显示其内容到TextEdit上,按另一个BUTTON键则实现另存为功能,即把 TextEdit上的内容写到新建的或者已有的...

    QT实现HEX文件操作

    资源中包括《HEX文件格式解析.pdf》文章,使用QT实现HEX文件生成、HEX文件解析、文件读写及文件拼接功能的工程源码,因项目开发写的工程,可以直接使用,也可作为HEX文件操作参考。

    Qt5开发及实例-CH901.rar,Qt5使用QFile类读写文本文件的代码

    Qt5开发及实例,实例CH901,建立基于控制台工程,使用QFile类读写文本文件。 实现步骤如下。 (1)建立一个工程。选择“文件”→“新建文件或项目...”菜单项,在弹出的对话框中选择“项目”组下的“Application”→...

    Qt5开发及实例-CH902.rar,Qt5使用QTextStream类读写文本文件的代码

    Qt5开发及实例,实例CH902,建立基于控制台的工程,使用QTextStream类读写文本文件。 (1)源文件“main.cpp”的具体实现代码如下: 其中, (a) if(data.open(QFile::WriteOnly|QFile::Truncate)):参数QFile::...

    qt 文件IO操作 读写操作源码

    按行读取指定目录下的txt文件,累计读取10行后将这10行数据写入到另外一个指定路径下的txt中;参考此demo可实现文本复制;

    QT写日志类实现实例

    //写尾并把缓存写入文件 int WriteReturn_And_ToFile&#40;const char *szApiName,int iReturn&#41;; //清空缓冲区日志 int ClearBuff(); //缓冲区日志写入文件后清空 int BuffToFile&#40;&#41;; //直接写入...

    Qt-读写二进制文件(数据结构)

    二进制文件存储方式比较方便,文本小,保密效果好 定义一个数据结构并实现相关操作 使用QDataStream进行读写操做 数据结构 #include struct AccountInfo { // 数据 QString Account; QString LogPasswd; // 初始...

    《Qt 学习之路 2》

    基于最新的Qt5.0.1的学习书籍,非常适合QT5的入门学习。 适合了解QT5与QT4区别的新手。 文章结构如下: 1 序 ...37 文本文件读写 38 存储容器 39 遍历容器 40 隐式数据共享 41 model/view 架构

    qt必备学习手册初级

    7.3 文本文件读写 75 8 Socket通信 76 8.1 TCP/IP 77 服务器端 77 客户端 79 8.2 UDP 81 广播 82 组播 82 8.3 TCP/IP 和 UDP的区别 83 9 多线程 83 9.1 线程介绍 84 9.2 多线程的使用 87 9.3 使用线程绘图 89 10 ...

    Qt学习之路2 (基于Qt5.0.1共58章)

    37. 文本文件读写 38. 存储容器 39. 遍历容器 40. 隐式数据共享 41. model/view 架构 42. QListWidget、QTreeWidget 和 QTableWidget 43. QStringListModel 44. QFileSystemModel 45. 模型 46. 视图和委托 47. 视图...

    python读写mdb、读excel的ui界面的源代码和exe文件

    python读写mdb、读excel的ui界面的完整源代码、mdb测试文件和excel测试文件和exe文件,使用Qt Designer产生ui文件,源代码用到了多线程、自定义信号和槽(slot)函数,两个文件打开对话框用来选择mdb文件和excel文件,...

    QT学习之路2 (1~82篇)

    37. 文本文件读写 38. 存储容器 39. 遍历容器 40. 隐式数据共享 41. model/view 架构 42. QListWidget、QTreeWidget 和 QTableWidget 43. QStringListModel 44. QFileSystemModel 45. 模型 46. 视图和委托 47. 视图...

Global site tag (gtag.js) - Google Analytics