1、html特殊字符的显示
我们知道html语言和C语言一样也有一些特殊字符,它们是不能正常显示的,必须经过转义,在网上可以查到如何显示这些字符,如下图所示:
上图给了最常用的特殊字符的显示,下面我们来实验一下:
首先在记事本中写入一句:
<font color=blue>程序例font>#include<stdio.h>
然后就文本后缀名改为.html后
,用浏览器打开,显示如下:
我们从上图可以发现include后面没有显示,但是当我们在文本中写入:
<font color=blue>程序例font>#include<stdio.h>
或
<font color=blue>程序例font>#include<stdio.h>
时就能正常显示了。显示结果如下图:
我们知道Qt能够支持html语言,但是我在编写可以查询c语言函数(肯定有#include后面<>的特殊字符的显示问题)的时候发现使用上面的方法仍然不能显示特殊字符,后来灵机一动,就决定 用全角<>来代替半角<> 。这样就不会当成是特殊字符了,就可以正常显示了。半角和全角的转换只需要点击下图中的第3个按钮:
虽然说,使用全角后看起来不是很协调,但还看得过去,如果读者有什么好的方法,请不吝赐教。
2、正则表达式
接着上面的问题继续说,比如我有一个C语言函数词典库,我取其中一段来举例:
<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文件:
#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;
}
程序运行结果如下:
下面放一张查单词软件用到的特殊字符显示和使用正则表达式后的截图: