C语言基础 (14) QT介绍
01 课程回顾
1.文件指针






02 作业讲解



03 作业讲解补充
04 项目概述
qt 是编辑器
gnu
05 C++介绍
面向对象介绍:封装,继承,多态
06 C++介绍2

或者全局变量(不安全

.完之后再.:

07 C++介绍3:
1.加上作用域,告诉编译器,setA()属于struct Test(C++才能用)
2.静态函数可以通过类型名直接调用,无需先创建对象

08 C++介绍总结:
//1、结构体中成员可以有变量,也可以有函数,变量在结构体内部,相当于内部的全局变量
//2、先创建结构体变量(对象),通过此变量(对象)调用成员
//3、如果函数为static函数,可以直接通过类型调用
//4、类中(结构体内部)声明函数,类外定义函数,类外定义的函数要加作用域
09 QT应用程序的创建

10 构造函数和析构函数


类,对象)


11_Qt介绍:控件内容的设置和获取

12 上午课程回顾
学会看帮助文档
13 QT字符编码
// 如果需要封装函数 函数内部需要使用ui控件 此函数必须为结构体(类)中的函数
// 类中声明,类外定义,定义时,加上作用域

// 字符编码(中文)
1、 给Qt控件设置内容,如果有中文,必须是UTF-8编码才能正常显示
2、 从Qt得到的字符串,如果有中文,编码是utf-8
3、如果使用标准C函数,如果有中文,必须是gbk编码 (有冲突啦)

(乱码)
// 要想显示中文,必须为utf-8,否则会乱码
#include <QTextCodec> // 字符编码转换头文件
QTextCodec *codec // 定义全局变量
// 初始化
codec = QTextCodec::codecForName(“GBK”); // 需要头文件 #include <QTextCodec>
ANSI,gbk,gb1830,gb2320(windows的中文编码)
a) 头文件 #include <QTextCodec>
b) 定义一个全局变量QTextCodec *codec
c) 构造函数内部,初始化
codec = QTextCodec::codecForName(“GBK”);
d) gbk -> utf-8: codec->toUnicode() // 转换为utf-8
e) utf-8 -> gbk : codec -> fromUnicode() // 从utf8 转为gbk
const char *str = “你好,自动调用析构函数,做一下清洁工作”
//codec->toUnicode(str)把str转换为utf-8格式,返回值就是转换后的字符串
//ui->label->setText(codec->toUnicode(str));
14 QT字符编码总结
- 声明,然后定义并调用


- C语言中的汉字是gbk编码的 但是QT中需要用unicode来显示


第一步,引入<QTextCodec>头文件: #include <QTextCodec>
第二步,声明全局变量: QTextCodec *codec;
第三部,初始化:codec = QTextCodec::codecForName(“GBK”)
ui->textEdit->setText(codec->toUnicode(“你好 阿斯顿”)
15 槽函数的说明

槽函数执行会打断界面的循环绘制,无条件执行这个函数
16_IDE案例:字符编码选择
17 打开文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog> // 文件对话框
#include <QTextCodec> // QT编码
#include <QDebug>
#include <string.h>
#define cout qDebug() // QDebug
QTextCodec *codec;
// 定义一个枚举类型
// 枚举
enum MyCode
{
utf_8,gbk
};
// 定义一个枚举变量
enum MyCode flag;
// 构造函数
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 初始化,默认显示utf-8
flag = utf_8;
codec = QTextCodec::codecForName("GBK");
}
// 析构函数
MainWindow::~MainWindow()
{
delete ui;
}
// utf-8按钮处理函数
void MainWindow::on_actionutf_8_triggered()
{
// 按下此按钮,需要utf-8编码
flag = utf_8;
// 标签需要显示utf-8 (第四步编码转换
ui->label->setText("当前以utf-8编码显示");
}
// gbk按钮处理函数
void MainWindow::on_actiongbk_triggered()
{
// 按下此函数,需要gbk编码
flag = gbk;
// 标签显示gbk
ui->label->setText("当前以GBK显示");
}
// 打开按钮处理函数
void MainWindow::on_actionopen_triggered()
{
// 1、打开一个文件,获取此文件的目录
QString path = QFileDialog::getOpenFileName();
cout << "path = " << path; //QString
//if(path == "") // 没有选择路径 这种写法比较low
if(path.isEmpty())
{
cout <<"空的";
return;
};
// 2、由于通过Qt控件获取的路径,此路径是utf-8编码 需要转换为gbk编码
// 同时将QString类型转换为char * 类型 (因为fopen 需要传char *类型
char *fileName = codec->fromUnicode(path).data();
cout << "fileName =" <<fileName;
// 3、打开文件,fopen(),fopen()如果有中文,需要gbk
FILE *fp = fopen(fileName,"rb");
if(fp == nullptr) // 文件打开失败F
{
cout <<"fopen err";
return;
}
// 4、循环读取文件内容fgets(), 读取的内容是char *
char buf[1024*2]; //给2k 的buf
QString str = "";
while(1)
{
//读之前 清空buf内容
memset(buf,0,sizeof(buf));
fgets(buf,sizeof(buf),fp);
if(flag == utf_8)
{
str = str+buf;
}
else if (flag == gbk)
{
// 可以将读取的gbk字符串转换为utf-8
str = str + codec->toUnicode(buf);
}
if(feof(fp)) //如果文件结尾,退出循环
{
break;
}
}
// 5、需要把读取的内容给编辑区设置 setText
ui->textEdit->setText(str);
// 6、关闭文件
fclose(fp);
}
18_IDE案例:字符编码说明
QString和char *转换:

注意:之前这里

如果我不做utf8编码转换,直接操作的话:
,如果有中文路径就不行了
只要和QT相关操作就得用Utf-8
只要和标准C交互操作,就得用GBK
19_IDE案例:另保存文件_rec
// 另存为
void MainWindow::on_actionsaveas_triggered()
{
//1、选择一个保存文件的路径,这个路径是从qt得到,是utf-8,返回类型是QString
QString path = QFileDialog::getSaveFileName();
if(path.isEmpty()) // 如果没有选择路径
{
return;
}
//2、需要将utf-8转换为gbk,同时将QString转换为char *
char *fileName = codec->fromUnicode(path).data();
//3、打开文件,fopen(),需要的路径为char *,有中文需要gbk
FILE *fp = fopen(fileName,"wb");
if(fp == nullptr) // 打开失败
{
cout << "文件打开失败";
return;
}
//4、获取编辑区的内容QString
QString str = ui->textEdit->toPlainText();
//5、将编辑区的内容QString类型转换为char *
const char *buf = str.toStdString().data();
//6、将编辑区的内容写入文件 fputs
fputs(buf,fp);
//7、关闭文件
fclose(fp);
}
20_IDE案例:项目流程说明_rec
21_IDE案例:编辑功能_rec
22_IDE案例:编译代码_rec
完整代码:
mianwindow.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog> // 文件对话框
#include <QTextCodec> // QT编码
#include <QDebug>
#include <string.h>
#define cout qDebug() // QDebug
QTextCodec *codec;
// 定义一个枚举类型
// 枚举
enum MyCode
{
utf_8,gbk
};
// 定义一个枚举变量
enum MyCode flag;
// 全局变量的路径
QString path;
// 构造函数
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 初始化,默认显示utf-8
flag = utf_8;
codec = QTextCodec::codecForName("GBK");
path = "";
}
// 析构函数
MainWindow::~MainWindow()
{
delete ui;
}
// utf-8按钮处理函数
void MainWindow::on_actionutf_8_triggered()
{
// 按下此按钮,需要utf-8编码
flag = utf_8;
// 标签需要显示utf-8 (第四步编码转换
ui->label->setText("当前以utf-8编码显示");
}
// gbk按钮处理函数
void MainWindow::on_actiongbk_triggered()
{
// 按下此函数,需要gbk编码
flag = gbk;
// 标签显示gbk
ui->label->setText("当前以GBK显示");
}
// 打开按钮处理函数
void MainWindow::on_actionopen_triggered()
{
// 1、打开一个文件,获取此文件的目录
path = QFileDialog::getOpenFileName();
cout << "path = " << path; //QString
//if(path == "") // 没有选择路径 这种写法比较low
if(path.isEmpty())
{
cout <<"空的";
return;
};
// 2、由于通过Qt控件获取的路径,此路径是utf-8编码 需要转换为gbk编码
// 同时将QString类型转换为char * 类型 (因为fopen 需要传char *类型
char *fileName = codec->fromUnicode(path).data();
cout << "fileName =" <<fileName;
// 3、打开文件,fopen(),fopen()如果有中文,需要gbk
FILE *fp = fopen(fileName,"rb");
if(fp == nullptr) // 文件打开失败F
{
cout <<"fopen err";
return;
}
// 4、循环读取文件内容fgets(), 读取的内容是char *
char buf[1024*2]; //给2k 的buf
QString str = "";
while(1)
{
//读之前 清空buf内容
memset(buf,0,sizeof(buf));
fgets(buf,sizeof(buf),fp);
if(flag == utf_8)
{
str = str+buf;
}
else if (flag == gbk)
{
// 可以将读取的gbk字符串转换为utf-8
str = str + codec->toUnicode(buf);
}
if(feof(fp)) //如果文件结尾,退出循环
{
break;
}
}
// 5、需要把读取的内容给编辑区设置 setText
ui->textEdit->setText(str);
// 6、关闭文件
fclose(fp);
}
// 另存为
void MainWindow::on_actionsaveas_triggered()
{
//1、选择一个保存文件的路径,这个路径是从qt得到,是utf-8,返回类型是QString
path = QFileDialog::getSaveFileName();
if(path.isEmpty()) // 如果没有选择路径
{
return;
}
//2、需要将utf-8转换为gbk,同时将QString转换为char *
char *fileName = codec->fromUnicode(path).data();
//3、打开文件,fopen(),需要的路径为char *,有中文需要gbk
FILE *fp = fopen(fileName,"wb");
if(fp == nullptr) // 打开失败
{
cout << "文件打开失败";
return;
}
//4、获取编辑区的内容QString
QString str = ui->textEdit->toPlainText();
//5、将编辑区的内容QString类型转换为char *
const char *buf = str.toStdString().data();
//6、将编辑区的内容写入文件 fputs
fputs(buf,fp);
//7、关闭文件
fclose(fp);
}
// 撤销按钮处理函数
void MainWindow::on_actionundo_triggered()
{
ui->textEdit->undo();
}
// 拷贝
void MainWindow::on_actioncopy_triggered()
{
ui->textEdit->copy();
}
// 粘贴
void MainWindow::on_actionpaste_triggered()
{
ui->textEdit->paste();
}
// 剪切
void MainWindow::on_actioncut_triggered()
{
ui->textEdit->cut();
}
// 编译代码
void MainWindow::on_actioncompile_triggered()
{
if(path.isEmpty()){
return;
}
cout << "path = " <<path;
// path
QString demo = path;
cout << "before demo" << demo;
demo.replace(".c",""); //把demo内部的字符串原来的.c替换为空字符
cout << "after demo" << demo;
QString cmd = QString("gcc %1 -o %2").arg(path).arg(demo);
cout << "cmd = " << cmd;
// 如果有中文,需要GBK,同时将QString转换为char *
// 如果编译的代码是正确,system返回值为0
int ret = system( codec->fromUnicode(cmd).data() );
cout << "ret = " << ret;
if(ret !=0 )
{
// 如果代码出错,重新再编译一次 并暂停,看看是什么错
cmd = QString("cmd /k gcc %1 -o %2").arg(path).arg(demo);
system( codec->fromUnicode(cmd).data() );
return;
}
// 能执行到这一步,说明代码编译成功
// 需要执行程序
QString target = QString("cmd /k %1").arg(demo);
// 如果有中文,需要gbk,同时将QString转换为char *
system( codec->fromUnicode(target).data() );
}


浙公网安备 33010602011771号