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字符编码总结

 

  1. 声明,然后定义并调用

 

 

  1. 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() );

 

}

 

posted @ 2019-01-20 11:54  hh9515  阅读(1766)  评论(0)    收藏  举报