Qt 官方示例 | 了解文件读写,看这个例子就够了

大家好,我是老吴,一枚勤劳的嵌入式底层劳动人民。

我又双叒叕来分享 Qt 的学习心得了。

学习 Qt 的最佳途径是阅读官方的手册和示例,

今天要分享的是 Qt 官方提供的示例:notepad。

notepad 是一个简易文本编辑器:

点击查看大图

它一个支持新建、打开、保存、复制、粘贴、剪切、撤销、重做等功能的迷你型文本编辑器,类似 Gedit。

源码文件:

notepad/
├── images
│   ├── bold.png
│   ├── copy.png
│   ├── create.png
│   ├── cut.png
│   ├── edit_redo.png
│   ├── edit_undo.png
│   ├── exit.png
│   ├── font.png
│   ├── info.png
│   ├── italic.png
│   ├── new.png
│   ├── open.png
│   ├── paste.png
│   ├── pencil.png
│   ├── print.png
│   ├── save_as.png
│   ├── save.png
│   └── underline.png
├── main.cpp
├── notepad.cpp
├── notepad.h
├── notepad.pro
├── notepad.qrc
└── notepad.ui

下面快速地说明一下如何实现这个小工具, let's go.

正文目录:

1. 新建 Qt Widgets Application
2. 利用 Qt Designer 设计界面
3. 实现 New / Open / Save 文件的功能
4. 相关参考
5. 好书推荐:《就因为没时间,才什么都能办到》

1. 新建 Qt Widgets Application

在 Qt Creator 里 点击,

File > New File or Project > Applications > Qt Widgets Application > Choose:

点击查看大图

以 QMainWindow 作为基类,子类名为 Notepad:

新建完成后会得到下列文件:

notepad/
├── main.cpp
├── notepad.cpp
├── notepad.h
├── notepad.pro
└── notepad.ui

notepad.cpp 和 notepad.h 是 Notepad Widget 对应的类的源代码。

notepad.ui 则是 Notepad Widget 对应的 UI 界面文件。

运行效果:

此时只有跟 QMainWindow 一样的界面,还没有任何编辑器相关的功能。

2. 利用 Qt Designer 设计界面

Notepad 的界面分为 4 部分:

点击查看大图
  1. 菜单栏,用 QMenuBar 实现;

  2. 工具栏,用 QToolBar 实现;

  3. 文本编辑框,用 QTextEdit 实现;

  4. 状态栏,用 QstatusBar 实现;

本文不会讲解 Notepad 的所有功能,而是以下面 3 个功能为例:

  • 创建文件

  • 打开文件

  • 保存文件

只要这 3 个功能的实现逻辑理清楚,实现整个 Notepad 肯定也没有问题。

在 Qt Designer 里:

  • 修改菜单栏,添加 File 菜单项

  • 修改工具栏,添加 New、Open、Save Action

  • 添加编辑框

运行效果:

此时的菜单栏和工具栏里按键并没有任何功能。

3. 实现 New / Open / Save 文件的功能

在 Qt 里用 Action 这个概念来简化菜单栏和工具栏的的编程,

每一个菜单项都会有自己的 Action,开发者可以在 Qt Designer 里的 Action Editor 里定制 Action。

当用户点击某个菜单项时,就会发出 QAction::triggered 信号,我们需要为其设置对应的槽函数以实现对应的业务功能。

绑定信号和槽:

// 文件:notepad.cpp
Notepad::Notepad(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::Notepad)
{
    ...
    connect(ui->actionNew, &QAction::triggered, this, &Notepad::newDocument);
    connect(ui->actionOpen, &QAction::triggered, this, &Notepad::open);
    connect(ui->actionSave, &QAction::triggered, this, &Notepad::save);
}

实现新建文件的功能

// 文件:notepad.h
class Notepad : public QMainWindow
{
    ...
private slots:
    void newDocument();
    void open();
    void save();

private:
    Ui::Notepad *ui;
    QString currentFile;
};

currentFile 用于保存当前文件的路径名。

void Notepad::newDocument()
{
    currentFile.clear();
    ui->textEdit->setText(QString());
    setWindowTitle("new File *");
}

创建新文件的过程很简单,就是清空文本框。

运行效果:

实现保存文件的功能

// 文件:notepad.cpp
void Notepad::save()
{
    QString fileName;

    // 如果前面没有保存过,则询问用户保存在哪里
    if (currentFile.isEmpty()) {
        fileName = QFileDialog::getSaveFileName(this, "Save");
        currentFile = fileName;
    } else {
        fileName = currentFile;
    }

    // 将文本框中的文本写到文件中
    QFile file(fileName);
    [...]
    setWindowTitle(fileName);
    QTextStream out(&file);
    QString text = ui->textEdit->toPlainText();
    out << text;
    file.close();
}

Qt 提供了 QFile 类用于进行文件操作。

QFile 类本身就有读写文件的接口,但是一般用 QTextStream or QDataStream 来读写文件会更加方便。

另外:

  • 处理临时文件可以使用 QTemporaryFile,

  • 获取文件信息可以使用 QFileInfo,

  • 处理目录可以使用 QDir,

  • 监视文件和目录变化可以使用 QFileSystemWatcher。

运行效果:

实现打开文件的功能

// 文件:notepad.cpp
void Notepad::open()
{
    // 用户选择要打开的文件
    QString fileName = QFileDialog::getOpenFileName(this, "Open the file");
    QFile file(fileName);
    [...]

    currentFile = fileName;
    setWindowTitle(fileName);

    // 用文本流将文件内容读到文本框中
    QTextStream in(&file);
    QString text = in.readAll();
    ui->textEdit->setText(text);
    file.close();
}

用上面的代码里可以看出,Qt 里的文本流操作非常简单。

运行效果:

到此,这个 Notepad 示例的 核心功能就实现完毕啦。感兴趣的小伙伴们请自行阅读 Qt example 里的完整代码吧。

文件 IO 是编程世界里非常重要的一环,在 Qt 的许多示例里都要用到这一块知识点,这里我们先初步地了解一下 QTextStream ,后续需要在更多的示例中演示 Qt 的 IO 操作。

相关参考

《Qt 官方文档》:

  • Creating Main Windows in Qt Designer

  • File and Datastream Functions

《C++ GUI Qt4 编程 (第二版)》

《Qt5 编程入门 (第二版)》

《Qt Creator 快速入门》

思考技术,也思考人生

要学习技术,更要学习如何生活

好书推荐:

《就因為「沒時間」,才什麼都能辦到》

作者:吉田穗波

2004年 取得名古屋大学研究所博士学位,妇产科医师。在工作和家庭多头奔忙的情况下,反而让她因有感于「若要改变现状,只能积极提升自己的程度」,而兴起再进修的念头。从申请入学哈佛,准备考试到录取,只花半年时间!2008 年带着三岁,一岁和一个月大的三个女儿,与丈夫一起前往波士顿,两年取得哈佛学位。

豆瓣评分:8.0,790人评价

点击查看大图

能收获什么?

  • 不一样的时间观念;

  • 实用的时间管理方法;

  • 积极的心理建设;

  • 接受无序的状态;

  • 接受事情只做了一部分的情况;

  • 抓大放小,请别人来帮助自己处理非核心任务;

你和我各有一个苹果,如果我们交换苹果的话,我们还是只有一个苹果。但当你和我各有一个想法,我们交换想法的话,我们就都有两个想法了。

觉得文章对你有价值,不妨 在看 + 分享

推荐阅读:

专辑 | Linux 驱动开发

专辑 | Linux 系统编程

专辑 | 每天一点 C

专辑 | Qt 入门

为了使更多的Qt初学者能尽快入门Qt,也为了QtQt Creator的快速普及,我们花费大量精力写出了这一系列教程。虽然教程的知识可能很浅显,虽然教程的语言可能不规范,但是它却被数十万网友所认可。我们会将这一系列教程一直写下去,它将涉及Qt的方方面面 一、Qt Creator的安装和hello world程序的编写 二、Qt Creator编写多窗口程序 三、Qt Creator登录对话框 四、Qt Creator添加菜单图标 五、Qt Creator布局管理器的使用 六、Qt Creator实现文本编辑 七、Qt Creator实现文本查找 八、Qt Creator实现状态栏显示 九、Qt Creator中鼠标键盘事件的处理实现自定义鼠标指针 十、Qt Creator中实现定时器和产生随机数 十一、Qt 2D绘图(一)绘制简单图形 十二、Qt 2D绘图(二)渐变填充 十三、Qt 2D绘图(三)绘制文字 十四、Qt 2D绘图(四)绘制路径 十五、Qt 2D绘图(五)显示图片 十六、Qt 2D绘图(六)坐标系统 十七、Qt 2D绘图(七)Qt坐标系统深入 十八、Qt 2D绘图(八)涂鸦板 十九、Qt 2D绘图(九)双缓冲绘图简介 二十、Qt 2D绘图(十)图形视图框架简介 二十一、Qt数据库(一)简介 二十二、Qt数据库(二)添加MySQL数据库驱动插件 二十三、Qt数据库(三)利用QSqlQuery类执行SQL语句(一) 二十四、Qt数据库(四)利用QSqlQuery类执行SQL语句(二) 二十五、Qt数据库(五)QSqlQueryModel 二十六、Qt数据库(六)QSqlTableModel 二十七、Qt数据库(七)QSqlRelationalTableModel 二十八、Qt数据库(八)XML(一) 二十九、Qt数据库(九)XML(二) 三十、Qt数据库(十)XML(三) 三十一、Qt 4.7.0及Qt Creator 2.0 beta版安装全程图解 三十二、第一个Qt Quick程序(QML程序) 三十三、体验QML演示程序 三十四、Qt Quick Designer介绍 三十五、QML组件 三十六、QML项目之Image和BorderImage 三十七、Flipable、Flickable和状态与动画 三十八、QML视图 三十九、QtDeclarative模块 四十、使用Nokia Qt SDK开发Symbian和Maemo终端软件 四十一、Qt网络(一)简介 四十二、Qt网络(二)HTTP编程 四十三、Qt网络(三)FTP(一) 四十四、Qt网络(四)FTP(二) 四十五、Qt网络(五)获取本机网络信息 四十六、Qt网络(六)UDP 四十七、Qt网络(七)TCP(一) 四十八、Qt网络(八)TCP(二)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值