很早之前就有了写一个类似Windows记事本的想法,加上最近也刚好在学编译原理,所以就想把两者结合起来,于是就打算结合MarkDown,开发一款MarkDown编辑器。

不过由于我之前一直使用的是Java语言居多,对c++并不熟悉,所以一些糟糕的代码风格和规范还望各位大佬谅解!

LightMD 即一款基于QT实现的markdown编辑器,当然也可以作为代码编辑器,由于时间与个人能力等原因,目前实现的功能非常有限!

主要包括:

  • 支持语法高亮(目前支持C/C++)

  • 支持MarkDown预览

  • 代码行数、文本信息统计等

  • 其它一些基本的文件处理相关功能

好了直接上图吧

本项目主要目的在于学习qt相关的windows开发,其中主要有以下几个模块:

  • 整体布局
  • 代码编辑器
  • markdown编辑器

整体布局

最外面当然是_QMainWindow_, 然后从上到下依次是

  • menuBar
  • QSplitter
  • statusBar

menubar的简单示例如下:

    QMenu *menuFile = menuBar()->addMenu(tr("&File"));
QAction *itemNew = new QAction(tr("&New"), this);
itemNew->setStatusTip(tr("Create a new file"));
connect(itemNew, &QAction::triggered, this, &Home::newFile);
menuFile->addAction(itemNew);

其中QMenu就是最外面显示的menu,即鼠标不点击就可以看见的那个menu;QAction则是QMenu上众多选项之一;然后是调用connect函数为QAction设置点击事件。

中间主体则是QSplitter,


QSplitter *centralSplitter = new QSplitter(this); setCentralWidget(centralSplitter); centralSplitter->addWidget(codeEditor);
centralSplitter->addWidget(preview);

首先new一个QSplitter,然后将其设置为中间组件,然后在QSplitter上再添加两个组件,分别为代码编辑区域和markdown预览区域的组件。

这两个区域在文章下面将有具体讲解。

底部则是statusBar:

    label = new QLabel("LightMD is ready!");
textType = new QLabel("Plain Text");
codeLength = new QLabel("Length:652");
codeLines = new QLabel("Lines:54"); statusBar()->addWidget(label, 1);
statusBar()->addPermanentWidget(textType);
statusBar()->addPermanentWidget(codeLength);
statusBar()->addPermanentWidget(codeLines);

label用来显示正常的提示消息;textType用来显示当前的文本类型,如markdown或c++等;codeLength和codeLines就不用过多解释了吧。

代码编辑器

其中代码编辑框我纠结了半天,用QPlainTextEdit好呢,还是QTextEdit好???其中StackOverflow上一高赞回答如下:

QPlainTextEdit is an advanced viewer/editor supporting plain text. It is optimized to handle large documents and to respond quickly to user input.

QPlainText uses very much the same technology and concepts as QTextEdit, but is optimized for plain text handling.

QPlainTextEdit works on paragraphs and characters. A paragraph is a formatted string which is word-wrapped to fit into the width of the widget. By default when reading plain text, > one newline signifies a paragraph. A document consists of zero or more paragraphs. Paragraphs are separated by hard line breaks. Each character within a paragraph has its

own attributes, for example, font and color.

简单点说,就是QPlainTextEdit对普通文本的支持度特别高,也就是很方便,不过一些复杂功能却不能实现;而QTextEdit是一个更加重量级的组件,支持各种复杂功能,不过一些简单的功能可能没有QPlainTextEdit使用的那么方便。

两者我都简单试用后,发现还是QPlainTextEdit用着比较方便,于是就决定采用QPlainTextEdit了。

然后关于代码框和代码行数的实现,QT的官方demo里面好像有现成的(不得不说,qt的demo是真的多!)。

所以,这里的实现我就不解释啥了。

markdown编辑器

这里官方也有个markdown的demo,下载就行了。不过要注意的是,这里由于用到了web引擎,所以这里必须使用vs来编译运行,安装vs环境这里不懂的还是自行百度吧。

官方demo中好像实现的都挺全的,我只是做了个小修改,然后就转移到LightMD来了。

其中markdown预览流程是先将markdown内容转换为对应的html内容,然后web引擎来显示HTML页面。

其中转换官方也全部为我们做好了。



由于时间关系,当然是直接套用了。不过以后有空的话,自己再去实现一下吧。

最后,LightMd项目地址:LightMD

QT学习小demo之LightMD(MarkDown编辑器)的更多相关文章

  1. Android学习小Demo(19)利用Loader来实时接收短信

    之前写过一篇文章<Android学习小Demo(13)Android中关于ContentObserver的使用>,在里面利用ContentOberver去监測短信URI内容的变化.我们先来 ...

  2. RPC框架学习+小Demo实例

    一.什么是RPC协议? 全称:远程过程调度协议 效果:使消费者向调用本地方法一样调用远程服务方法,对使用者透明 目前常用:Dubbo.Thirft.Sofa.... 功能: 建立远程通信(socket ...

  3. Android学习小Demo一个显示行线的自定义EditText

    今天在处理一个EditText的时候,想着把EditText做成像一本作业本上的纸一样,每一行都可以由线条隔开,具体效果如下: 1)最开始的思路 一开始的想法是很简单的,找出每一行的高度,然后一行一行 ...

  4. QT学习小技巧

    原地址:http://blog.csdn.net/ykm0722/article/details/6947250 转载: 分享在比赛中写代码时,发现的几个对写程序很有用的小段代码,虽小但是在我的软件中 ...

  5. Android学习小Demo(20)关于Fragment的应用

    Android在3.0之后引入了Fragment的概念,我推測其想法可能仅仅是想更好地兼容大屏幕或者平板的开发,由于大屏幕能够展示很多其它的内容,而内容一多,逻辑有可能就乱,而利用Fragment,则 ...

  6. Android学习小Demo(21)ListView的联动选择

    在日常的App开发中,尤其是在开发生活服务的应用上,非常多时候,我们会须要联动地展现省市区的数据等,需求大概例如以下: 1)展现全部省份 2)当点击某省份的时候,在二级菜单上展现此省份以下所属的城市列 ...

  7. Qt学习笔记-更高级的文本编辑器-完善第一版-gif动画

    现在的浏览器大多都有动作图标,现在我们也为浏览器加上图标. 在网上搜索到了几个ico的图标.现在直接拿来用. 首先创建资源文件. 在工程名上鼠标右键,选择add new 然后再选择 Qt Resour ...

  8. [Unity3D]做个小Demo学习Input.touches

    [Unity3D]做个小Demo学习Input.touches 学不如做,下面用一个简单的Demo展示的Input.touches各项字段,有图有真相. 本项目已发布到Github,地址在(https ...

  9. 学习react,动手实现一个小demo(仿知乎问答)

    学习react也有一周的时间,最近自己做了个仿知乎问答的小demo,项目源码在github上:https://github.com/yang302/reactQa 使用技术:bower+gulp+re ...

随机推荐

  1. Jetson TX2火力全开

    Jetson Tegra系统的应用涵盖越来越广,相应用户对性能和功耗的要求也呈现多样化.为此NVIDIA提供一种新的命令行工具,可以方便地让用户配置CPU状态,以最大限度地提高不同场景下的性能和能耗. ...

  2. Trie(前缀树/字典树)及其应用

    Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,PATRICIA tree,以及bitwise版本的crit-bit tree.当然很多名字的意义其实有交 ...

  3. Golang Channel用法简编

    转自:http://tonybai.com/2014/09/29/a-channel-compendium-for-golang/ 在进入正式内容前,我这里先顺便转发一则消息,那就是Golang 1. ...

  4. LIBCMTD.lib(wincrt0.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用

    无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用 出现原因: 连接程序在负责连接可执行程序时,选择相应的c/c++运行时启动函数.如果设定了/s ...

  5. play的job执行方式

    除了使用Quartz CRON trigger, 还可以写一个action来专门触发job,这样子就可以随时启动job的开始,而且还能并行其他的任务.较方便.

  6. SQL标量值函数:返回汉字拼音首拼

    今天遇到一个需求,客户要求在系统客户端选择客户的时候,可以用拼音首拼去快速过滤选择,此时我们在客户表里面加多一个拼音首拼字段CustPY来记录,字段加好了,我们要把所有客户名称的拼音简拼都更新到Cus ...

  7. storm shell命令源码分析-shell_submission.clj

    当我们在shell里执行storm shell命令时会调用shell_submission.clj里的main函数.shell_submission.clj如下: shell_submission.c ...

  8. CodeForces 279C Ladder (RMQ + dp)

    题意:给定一个序列,每次一个询问,问某个区间是不是先增再降的. 析:首先先取处理以 i 个数向左能延伸到哪个数,向右能到哪个数,然后每次用RQM来查找最大值,分别向两边延伸,是否是覆盖区间. 代码如下 ...

  9. Good Bye 2014 B. New Year Permutation(floyd )

    题目链接 题意:给n个数,要求这n个数字小的尽量放到前面,求一个最小的. 给一个矩阵s[i][j]==1,表示位置 i 的数字可以和 位置 j 的数字交换. 分析: 刚开始用的是3个循环,每次都找一个 ...

  10. Sharepoint2013商务智能学习笔记之Secure Store Service服务配置(二)

    Secure Store Service 是运行在应用程序服务器上的授权服务,它提供一个存储用户凭据的数据库,Secure Store Service 在商务智能中的地位很重要,Sharepoint商 ...