0%

【Qt编程】基于Qt的词典开发系列html特殊字符及正则表达式

1、html特殊字符的显示

我们知道html语言和C语言一样也有一些特殊字符,它们是不能正常显示的,必须经过转义,在网上可以查到如何显示这些字符,如下图所示:

图1

上图给了最常用的特殊字符的显示,下面我们来实验一下:

首先在记事本中写入一句:

1
<font color=blue>程序例</font>#include<stdio.h>

然后就文本后缀名改为.html后,用浏览器打开,显示如下:

图2

我们从上图可以发现include后面没有显示,但是当我们在文本中写入:

1
2
3
<font color=blue>程序例</font>#include<stdio.h>   

<font color=blue>程序例</font>#include<stdio.h>

这时就能正常显示了。显示结果如下图:

图3

​ 我们知道Qt能够支持html语言,但是我在编写可以查询c语言函数(肯定有#include后面<>的特殊字符的显示问题)的时候发现使用上面的方法仍然不能显示特殊字符,后来灵机一动,就决定用全角<>来代替半角<>。这样就不会当成是特殊字符了,就可以正常显示了。半角和全角的转换只需要点击下图中的第3个按钮:

图4

虽然说,使用全角后看起来不是很协调,但还看得过去,如果读者有什么好的方法,请不吝赐教。

2、正则表达式

​ 接着上面的问题继续说,比如我有一个C语言函数词典库,我取其中一段来举例:

1
<font color=blue>程序例</font>:<br>#include <span style="color:#ff0000;"><</span>stdio.h <span style="color:#ff0000;">></span><br>#include <span style="color:#ff0000;"><</span> stdlib.h <span style="color:#ff0000;">></span><br>int main(void)<br>

因为我们需要将上述半角的<>转换为全角的<>,并且只是替换处于头文件的半角<>即字符串中为红色的部分。当然当文件比较小的时候,可以手动查找替换,但是由于词典一半都有十几M,这时就必须使用正则表达式了。

​ 在Qt中,使用了QRegExp来支持正则表达式。关于正则表达式的语法,网上都有很多教程,我就不细说了。从上面的实例字符串的内容,我们知道包含了几个头文件,所以我们在匹配时,要分别匹配各个头文件两边的半角<>,即我们要使用非贪婪模式,否则就会从第一个头文件的<匹配到最后一个头文件的>。我们知道,在正则表达式中,非贪婪模式是由’?’来指定的,但是对于QRegExp类来说,?是不合法的。在QRegExp中,要使用setMinimal函数来指定贪婪模式setMinimal(true)就是非贪婪模式,setMinimal(false)就是贪婪模式。

​ 通过上面两部分的讲解,就可以完成C语言函数库词典的显示了。下面通过代码实现,新建Qt Gui应用程序,选择基类为QWidget,其中只需要修改widget.cpp里的内容即可(需要在widget.ui界面中,添加两个label,分别命名为label和label1)。

widget.cpp文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "widget.h"
#include "ui_widget.h"

#include<QString>
#include<QRegExp>
#include<QDebug>
#include<QLabel>

Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QString str="<font color=blue>程序例</font>:<br>#include <stdio.h ><br>#include < stdlib.h ><br>int main(void)<br>";
ui->label->setText(str); //由于Qt也能识别html格式,而< >是html的特殊字符,因此不处理的话,就会出现显示出错

QRegExp rx("#include (<(.*.h )>)");//正则表达式里的括号是为了获取匹配的内容
rx.setMinimal(true);//非贪婪模式

int pos=0;//从字符串的开始部分
for(int i=0;i<str.size();i++)
{

pos=rx.indexIn(str,0);//得到匹配字符串的位置
while(pos!=-1)//匹配成功
{
str.replace(rx.cap(1),"<"+rx.cap(2)+">");//这里是进行替换,如果不明白rx.cap是什么,可以qDebug显示内容
pos=rx.indexIn(str,pos+rx.matchedLength());//从当前位置,继续往后进行匹配
}
}

ui->label1->setText(str);
}

Widget::~Widget()
{
delete ui;
}

程序运行结果如下:

图5

下面放一张查单词软件用到的特殊字符显示和使用正则表达式后的截图:

图6

注意:我使用的平台为QT5,如果转移到Qt4上有错的话,可以反向参考http://qt-project.org/wiki/Transition_from_Qt_4.x_to_Qt5

基于Qt的词典开发系列

  1. 词典框架设计及成品展示
  2. 本地词典的设计
  3. 开始菜单的设计
  4. 无边框窗口的缩放与拖动
  5. 无边框窗口的拖动
  6. 界面美化设计
  7. 调用网络API
  8. 用户登录及API调用的实现
  9. JSON数据解析
  10. 国际音标的显示
  11. 系统托盘的显示
  12. 调用讲述人
  13. 音频播放
  14. 自动补全功能
  15. HTML特殊字符及正则表达式
  16. 后序

作品下载地址(发布版)http://download.csdn.net/detail/tengweitw/8548767

作品下载地址(绿色版)http://download.csdn.net/detail/tengweitw/8830495

源码下载地址http://download.csdn.net/detail/tengweitw/8830503

坚持原创技术分享,您的支持将鼓励我继续创作!