自己动手打造属于自己的C语言IDE

建议:建议先观看功能演示,然后根据功能演示想想思路,然后看博文中的思路,最后再看博文代码,最后再看完整代码,这样效果会更好。

功能介绍:一款基于QT的简易c语言编辑器,可以编辑,编译和运行。

环境配置:编译运行功能的前提是windows平台上已经安装gcc并配置到系统环境变量中,这个的配置方式可自行百度,很多帖子有讲。或直接安装QT,便于阅读源码。同时,安装QT自带会安装gcc,将其配置到环境变量中即可

整体运行效果可观看成品展示

UI

在创建工程的时候勾选上UI选项,会自动生成一个mainWindow,在菜单栏中点击添加菜单功能,然后在ui文件中通过拖拽控件布局。布局完成后,在布局下方找到对应控件名称并右键转到槽,工程会自动在mainwindow.cpp中生成对应的槽函数,在槽函数中即可实现各自功能。槽函数的命名为on_action控件名_triggered

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FHhevjxk-1587451488157)(D:…/configImages/QT_UI.png)]

主要功能实现

打开文件

思路:通过QFileDialog::getOpenFileName()函数获取文件路径。然后通过fopen打开路径对应的文件,并通过一个临时变量str存放文件中的内容,最后通过ui->textEdit->setText()函数将临时变量中的内容展示在文本编辑控件中。最后关闭文件。

注意:通过QFileDialog::getOpenFileName()函数获取的文件路径是QString类型的数据,所以在给fopen使用前需要转换为char *类型。QT中使用UTF-8编码,所以如果文件使用GBK编码,需要转换编码方式。

API说明

  • QFileDialog::getOpenFileName() 通过可视化方式获取路径
  • codec->fromUnicode(path).data()改变编码方式并转换数据类型
  • codec->toUnicode(buf) 转换为UTF-8编码
  • ui->textEdit->setText(str) 向文本编辑框放入待编辑内容

代码实现:

void MainWindow::on_actionOPEN_triggered()
{// 打开文件,获取文件路径path = QFileDialog::getOpenFileName();cout << "path=" << path;if(path.isEmpty()){// 没有选择路径直接退出return;}// 字符编码转换char *fileName = codec->fromUnicode(path).data();// 打开文件并读取内容,并放进编辑区FILE *fp = fopen(fileName, "rb");if(fp == NULL){cout << "on_actionOPEN_triggered() fopen err";return;}char buf[1024*5];QString str = "";// 读取文件while (1) {memset(buf, 0, sizeof (buf));fgets(buf, sizeof (buf), fp);// 根据标志位改变字符编码方式if(flag == utf_8){str += buf;}else if(flag == GBK){str += codec->toUnicode(buf);}if(feof(fp)){break;}}// 将文件内容放进编辑区ui->textEdit->setText(str);// 关闭文件fclose(fp);fp = NULL;}

文件另存为

思路:通过QFileDialog::getSaveFileName()获取文件待保存的路径,然后通过临时变量保存文本编辑区的内容,最后通过写的方式打开待保存的路径,将临时变量内容写入,关闭文件即可。

注意:依旧是编码方式,还有QStringchar *类型的不同

API说明

  • QFileDialog::getSaveFileName() 通过可视化方式获取保存路径
  • str.toStdString().data()QString转换为char * 类型
  • ui->textEdit->toPlainText() 获取文本编辑框内容

代码实现:

void MainWindow::on_actionSAVE_AS_triggered()
{// 选择另存为的路径,为UTF8编码,返回类型为QString类型path = QFileDialog::getSaveFileName();if(path.isEmpty()){// 如果没有选择路径直接退出return;}// 需要将路径转换为GBK编码,并且为char * 类型const char *fileName = codec->fromUnicode(path).data();cout << fileName;// 打开文件并读取内容,并放进编辑区FILE *fp = fopen(fileName, "wb");if(fp == NULL){cout << "on_actionSAVE_AS_triggered open file err";}// 获取编辑区的内容,返回QStringQString str = ui->textEdit->toPlainText();// 将QString转换为char * 类型const char *buf = str.toStdString().data();fputs(buf, fp);// 关闭文件fclose(fp);
}

文件保存

思路:如果是open一个文件改动后需要保存,那么在open的时候就已经获取到了文件路径,直接将编辑区的内容获取后保存到指定文件中即可。如果打开编辑器后开始编辑内容需要保存,那么此时没有获取过路径,就需要通过QFileDialog::getSaveFileName()获取一下保存路径。

注意:依旧是编码方式,还有QStringchar *类型的不同。

API说明:无特殊API用到的上面已经介绍过。

代码实现:

void MainWindow::on_actionSAVE_triggered()
{// 如果刚打开编辑器开始写东西,此时path为空就需要通过getSaveFileName获取一个路径if(path.isEmpty()){path = QFileDialog::getSaveFileName();}const char *fileName = codec->fromUnicode(path).data();// 打开文件并读取内容,并放进编辑区FILE *fp = fopen(fileName, "wb");if(fp == NULL){cout << "on_actionSAVE_triggered open file err";}// 获取编辑区的内容,返回QStringQString str = ui->textEdit->toPlainText();// 将QString转换为char * 类型const char *buf = str.toStdString().data();fputs(buf, fp);// 关闭文件fclose(fp);
}

编译运行

思路:首先判断一下需要运行的文件是否已经存在,如保存文件中出现的第二种情况,一打开编辑器就开始编辑的文件,还没保存到本地,那么就需要先保存到本地。然后通过gcc filename.c -o filename生成可执行文件,再执行可执行程序即可。第一步获取filename:通过QString的replace函数将路径最后的.c去掉即可。第二步执行可执行程序。

注意:执行以上的两部都需要在终端执行,直接调用system函数即可。如果编译出错,那么就不能继续执行,需终端停留在报错页面,使用cmd /k可实现终端停留

API说明:

  • replace() QString中的函数,替换字符串中指定字符串。
  • QString("gcc %1 -o %2").arg(arg1).arg(arg2) QString格式化
  • ui->textEdit->toPlainText() 获取文本编辑框内容

代码实现:

void MainWindow::on_actioncomplie_triggered()
{if(path.isEmpty()){// 如果没有路径则需要保存一下才能运行this->on_actionSAVE_triggered();}QString demo = path;// 生成的目标文件名demo.replace(".c", "");// gcc filename.c -o filenameQString cmd = QString("gcc %1 -o %2").arg(path).arg(demo);// system执行成返回0int ret = system(codec->fromUnicode(cmd).data());if(ret != 0){// cmd /k 停留在终端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);system(codec->fromUnicode(target).data());system("cmd");
}

改变字符编码

思路:通过codec->fromUnicode(path)codec->toUnicode(buf)两个API实现编码转换功能。由于字符编码需要在好几个槽函数中使用,所以思考定义一个全局变量,通过这个全局变量的状态来判断如何转换。通过ui->label->setText在左下角实时显示当前的编码方式。

注意:别的槽函数使用,所以需要使用全局变量。

API说明:

  • replace() QString中的函数,替换字符串中指定字符串。
  • QString("gcc %1 -o %2").arg(arg1).arg(arg2) QString格式化
  • ui->label->setText("当前以GBK显示,切换编码后请重新打开文件") 将制定内容显示在label中。

代码实现:

// UTF_8转换函数
void MainWindow::on_actionUTF_8_triggered()
{// 按下转换按键,为UTF_8flag = utf_8;ui->label->setText("当前以UTF-8显示,切换编码后请重新打开文件");
}// GBK转换函数
void MainWindow::on_actionGBK_triggered()
{// 按下按键转换为GBKflag = GBK;ui->label->setText("当前以GBK显示,切换编码后请重新打开文件");
}

退出、复制、粘贴、剪切、撤销

思路:直接调用QT自带的相应的功能函数。

API说明:

  • ui->textEdit->copy() 复制
  • ui->textEdit->paste() 粘贴
  • ui->textEdit->cut() 剪切
  • 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_actionundo_triggered()
{ui->textEdit->undo();
}// 退出系统
void MainWindow::on_actionQUITE_triggered()
{exit(0);
}

完整代码

完整的工程代码连接:https://github.com/wtzhu13/CPPOrCProectDemo/tree/master/IDE

GitHub有时太慢,同步一下国内链接:https://gitee.com/wtzhu13/CPPOrCProectDemo.git

**彩蛋:**这个项目中还包含其他一些练手小项目,后续会慢慢更新,不断往里添加。

C语言小项目——动手打造属于自己的C语言IDE相关推荐

  1. c语言为什么要建项目,一个C语言小项目为什么都说牛逼

    原标题:一个C语言小项目为什么都说牛逼 意在鼓励C语言学者.更有兴趣,学习更富有创业和乐趣! 推荐加学习交流群:658807522 可以在一起学习交流,既是参赛选手,又是学者,也可以先学习再参赛,反正 ...

  2. C语言小项目——走迷宫

    C语言小项目--走迷宫 设计方向: 1.定义二维字符数组作为迷宫 2.定义变量记录老鼠的位置 3.判定移动后位置的变化 4.记录游戏时长 5.判定到达终点的条件 总体设计: 1.用不同字符代表墙.老鼠 ...

  3. C语言小项目之“究极无敌螺旋丸极爆炸狂拽炫酷五彩棒的”通讯录之*派小猩*作品

    C语言小项目之"究极无敌螺旋丸极爆炸狂拽炫酷五彩棒的"通讯录之派小猩作品 项目概述 基于C语言开发一个多功能的通讯录 功能目录 1.增加 2.删除 3.查找 4.修改 5.显示 6 ...

  4. C语言小项目——通讯录的存储系统(静态版,动态版,文件版)

    目录 前言 一.总体设计框架 二.三种通讯录的功能阐述 三.静态通讯录 1.结构体设计 2.初始化通讯录 3.增加联系人的信息 4.删除联系人的信息 5.查找指定联系人并打印 6.修改联系人的信息 7 ...

  5. 嵌入式培训经验分享——C语言小项目(五子棋)

    在学习了C语言的基本语法之后,我们可以尝试着来做一个小小的项目,下面是我尝试着做的一个小项目-----五子棋,分享给大家,功能不太完善,多多指教,里面没有用到指针的知识点. #include < ...

  6. C语言小项目Conway‘s_Game_of_Life

    这是我C语言的一个小项目,如有Bug请指出. 用C语言来实现Conway's_Game_of_Life 规则: 细胞有存活或死亡两种状态,与自身周围的八个细胞互动 细胞周围的存活细胞 == 2个时,该 ...

  7. C语言小项目之猜数字

    学习完c语言循环.选择内容,我们对c语言有个初步的认识了,让我们来实现一个小项目吧!!! 1.猜数字小项目分析: 我们利用c语言制造出随机数来猜,在只知道范围的前提下我们无非有以下三种可能,猜大了.猜 ...

  8. C语言小项目-《通讯录》(超详细讲解)

    加油加油!!! 文章目录 前言 一:静态库通讯录 1:通讯录介绍 1.1代码主体框架的介绍 1.2 要实现的功能 2:通讯录实现 2.1 通讯录的外部封装 2.1 创建通讯录 2.2 初始化通讯录 2 ...

  9. 学习笔记10-C语言-小项目-五子棋

    小项目: 需要的数据 1.定义棋盘的二维数组 2.定义变量用于记录下棋的坐标 3.定义角色 @ 黑棋 O 白棋 * 空位业务逻辑: 是否需要对数据初始化 for(;;) {1.清屏.显示棋盘2.落子坐 ...

  10. 单片机c语言小项目开发,单片机的一些开发技巧(一)

    很多朋友正在学习单片机开发技术,但开发中免不了要碰到这样.那样的问题,有些问题可能无碍大局,但有一些问题却直接影响到产品的成本.体积.性能.这里介绍笔者的几个技巧,希望对大家的工作有帮助. 一.C语言 ...

最新文章

  1. [Nancy On .Net Core Docker] 轻量级的web框架
  2. WPF 支持分组互斥的 RadioButton 式单选菜单
  3. JVM 1.类的加载、连接、初始化
  4. python文件操作和集合(三)
  5. 三、Dockerfile的说明和编写
  6. CCF-CSP 201712-2 游戏(C++实现)
  7. 【机器学习】算法面试知识点整理(持续更新中~)
  8. python数字字符是什么_大佬们,想问一下Python中特殊字符的代码是什么啊,只知道数字是digits...
  9. Bash:把粘贴板上的内容拷贝的文件中。(脚本)
  10. OpenCV学习笔记九-Canny边缘检测
  11. WDK tips (9.1) 同步机制与锁
  12. CF741C Arpa’s overnight party and Mehrdad’s si
  13. 搜索引擎怎么收集的那么多内容?
  14. 树形动规_(战略游戏)
  15. VM安装ubuntu18.04完成时不能上网,显示cable unplugged
  16. MySQL 8.0.22 源码编译安装全过程
  17. 【白皮书分享】2020年5G应用创新发展白皮书.pdf(附下载链接)
  18. discuz点歌台插件
  19. 如果删除了DOM元素,是否还将其侦听器也从内存中删除了?
  20. java8 collections_关于Jdk7与Jdk8对Collections进行分组的区别

热门文章

  1. django book 制作
  2. PHP二开在线要饭网赞助系统源码开源版
  3. java毕业生设计超市自助结账系统的设计与实现计算机源码+系统+mysql+调试部署+lw
  4. 什么是微网格?微网格规划应考虑哪些因素?
  5. php 判断 小米 手机浏览器,网信办宣布整治手机浏览器 华为、QQ、小米等先查
  6. DEA博弈交叉效率matlab,基于博弈交叉效率DEA模型的服务模块化创新绩效测量—以江西省文化创意产业为例...
  7. 在Microsoft Office 2007中检测和修复应用程序
  8. Ubuntu解压、压缩zip、tar、tar.gz、tar.bz2文件
  9. 测试ai模糊软件,“马赛克视频”还原软件被疯传!实际测试后,效果差距太大!...
  10. 电子表程序c语言,单片机c语言编程实例:电子表