当前位置: 首页 > article >正文

Qt学习笔记第51到60讲

第51讲 记事本实现打开功能

回到第24个功能文件Notepad,给UI中的各个控件添加槽函数。

①开始按钮

void Widget::on_btnOpen_clicked()
{
    QString fileName=QFileDialog::getOpenFileName(this,tr("Open File"),
    "E:\\6_Qt Projects\\24_Notepad\\files",tr("Text(*.txt *.doc)"));
    //QFileDialog限制程序可打开的文件形式为txt文件或者doc文本
    
    ui->textEdit->clear();
    //每次打开文件时清除控件区域“textEdit”
    
    QFile file;
    file.setFileName(fileName);

    if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
    {
        qDebug()<<"file open error";
    }

    QTextStream in(&file);
    in.setCodec("UTF-8");

    while(!in.atEnd())
    {
        QString context=in.readLine();
        //qDebug()<<qPrintable(context);

        ui->textEdit->append(context);
        //将读取到的每行内容通过 append 方法添加到界面的文本编辑框(ui->textEdit)中
    }


    file.close();
}

实现效果:

依次点击

输出结果为:

再试一下打开另外一个文件:

新内容正确显示,原本的文件内容也已经被删除。

第52讲 记事本实现保存新建文件的功能

本质山是为下面这个按键编写槽函数。

代码示例

void Widget::on_btnSave_clicked()
{
    QString fileName=QFileDialog::getSaveFileName(this,tr("Save File"),
    "E:\\6_Qt Projects\\24_Notepad\\files\\untitle.txt",tr("Text(*.txt *.doc)"));

    QFile file;
    file.setFileName(fileName);

    if(!(file.open(QIODevice::WriteOnly|QIODevice::Text)))
    {
         qDebug()<<"failed to open file!"<<endl;
    }else{
        QTextStream out(&file);
        out.setCodec("UTF-8");
        QString context=ui->textEdit->toPlainText();
        out<<context;
    }

    file.close();
}

逐步讲解

1.获取保存文件名

 QString fileName=QFileDialog::getSaveFileName(this,tr("Save File"),
    "E:\\6_Qt Projects\\24_Notepad\\files\\untitle.txt",tr("Text(*.txt *.doc)"));

2.设置文件对象的文件名

    QFile file;
    file.setFileName(fileName);

3.打开文件并进行错误处理

if(!(file.open(QIODevice::WriteOnly|QIODevice::Text)))
{
     qDebug()<<"failed to open file!"<<endl;
}

4.写入文件

else{
    QTextStream out(&file);
    out.setCodec("UTF-8");
    QString context=ui->textEdit->toPlainText();
    out<<context;
}

5.关闭文件

第53讲 记事本实现关闭按键

在widget.h文件中,实例化一个QFile类型的对象file,作为widget类的public成员变量。

public:
    QFile file;
    Widget(QWidget *parent = nullptr);
    ~Widget();

在为关闭键编写槽函数之前,我们需要先修改打开和保存的槽函数:

void Widget::on_btnOpen_clicked()
{
    QString fileName=QFileDialog::getOpenFileName(this,tr("Open File"),
    "E:\\6_Qt Projects\\24_Notepad\\files",tr("Text(*.txt *.doc)"));
    //QFileDialog限制程序可打开的文件形式为txt文件或者doc文本

    ui->textEdit->clear();
    //每次打开文件时清除控件区域“textEdit”

    //QFile file;
    file.setFileName(fileName);

    if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
    {
        qDebug()<<"file open error";
    }

    QTextStream in(&file);
    in.setCodec("UTF-8");

    while(!in.atEnd())
    {
        QString context=in.readLine();
        //qDebug()<<qPrintable(context);

        ui->textEdit->append(context);
        //将读取到的每行内容通过 append 方法添加到界面的文本编辑框(ui->textEdit)中
    }


    //file.close();
}

void Widget::on_btnSave_clicked()
{
    QString fileName=QFileDialog::getSaveFileName(this,tr("Save File"),
    "E:\\6_Qt Projects\\24_Notepad\\files\\untitle.txt",tr("Text(*.txt *.doc)"));

    //QFile file;
    file.setFileName(fileName);

    if(!(file.open(QIODevice::WriteOnly|QIODevice::Text)))
    {
         qDebug()<<"failed to open file!"<<endl;
    }else{
        QTextStream out(&file);
        out.setCodec("UTF-8");
        QString context=ui->textEdit->toPlainText();
        out<<context;
    }

    //file.close();
}

将file的重定义与close成员函数注释掉。

最后展示一下关闭键的槽函数示例:

void Widget::on_btnClose_clicked()
{
   if(file.isOpen())
   {
       file.close();
       ui->textEdit->clear();
   }
}

第54讲 字符编码问题引入

在工程文件中新建一个ANSI编码的文本:

①可以直接通过另存为修改编码格式

②微软的记事本有这个选项卡可以修改编码格式

我在里面写了一句唐诗,再通过我们自己的记事本打开可以发现读取出来的文本完全是乱码。

这是因为我们在这里直接写死了编码形式为UTF-8。


http://www.kler.cn/a/429030.html

相关文章:

  • SpringBoot多级配置文件
  • 使用 Thermal Desktop 进行航天器热分析
  • Web端实时播放RTSP视频流(监控)
  • npm ERR! code CERT_HAS_EXPIRED
  • AWS S3 跨账户访问 Cross Account Access
  • 联发科MTK6762/MT6762安卓核心板_4G智能模块应用
  • 深入探索 Compose 渲染流程:从 UI 树到 Skia 绘制的实现解析
  • 关于csgo游戏搬砖作弊与封禁
  • 沪合共融 “汽”势如虹 | 昂辉科技参加合肥上海新能源汽车产业融合对接会
  • git 拉取代码时报错 gitignore Please move or remove them before you merge.
  • 21 网络编程:Go 语言如何玩转 RESTful API 服务
  • 数据分析: 基于CSDN博客排行榜TOP100的博客创作分析和建议
  • .vscode文件中各个脚本需要修改的地方
  • uni-app登录界面样式
  • python插入mysql数据
  • 漫画之家系统:Spring Boot技术下的漫画阅读优化
  • 【C语言】fscanf 和 fprintf函数
  • 【Qt移植LVGL】QWidget手搓LVGL软件仿真模拟器(非直接运行图形库)
  • 用Python开发一个经典贪吃蛇小游戏
  • 【Stable Diffusion】ComfyUI 基础教程-环境部署和插件安装
  • MQ 队列 的 通信过程
  • SpringBoot整合Mockito进行单元测试超全详细教程 JUnit断言 Mockito 单元测试
  • String IP和Int IP的互相转换
  • HTML旋转爱心(完整代码)
  • lanqiaoOJ 3744:小蓝的智慧拼图购物 ← pair+优先队列
  • Origin快速拟合荧光寿命、PL Decay (TRPL)数据分析处理-方法二