Qt的文本引擎
贯穿整个库,Qt 3都使用了一个完全重新设计的文本引擎和布局引擎。
它支持在世界范围内使用的几乎所有书写系统,包括:
- 阿拉伯语
- 汉语
- 古斯拉夫语 (俄语)
- 希腊语
- 希伯来语
- 日语
- 汉语
- 拉丁语 (例如,英语和一些其它欧洲语言)
- 泰国语
- 越南语
这些书写系统中的一些展示了特殊的特征:
- 特殊的断行符。一些亚洲语言在词中间没有空格。断行符出现在汉语、日语和汉语的字符(也有例外)后,或者泰国语中的逻辑词的边界后。
- 双向书写。阿拉伯语和希伯来语是从右向左书写的,除了数字和嵌入的英文文本是从左向右书写的。准确的书写习惯在Unicode第9号技术报告有定义。
- 无间距或者可区别的符号(欧洲语言中的重音或元音变音)。像越南语这样的一些语言很广泛地使用了这类符号并且同时字符中使用一些符号来澄清发音。
- 连字。在特殊的内容中,相互跟随的一些字符被一些使用连字符的结合体替换。最普通的例子就是在美国和欧洲的书籍排版中使用的ff和fi连字。
除了现在仅仅被特殊情况下的阿拉伯语支持的连字,Qt试图处理所有上面提到的特殊特征。只要你使用Qt的输入(例如,QLineEdit,QTextView或者它们的继承类)和显示控制(例如,QLabel),你将永远不用担心这些特征。
对于这些书写系统的支持对程序员是透明的并且完全地封装在Qt的文本引擎中。这就意味着你不需要去知道使用特殊语言的书写系统,除了下面列出的一些小事情。
- QPainter::drawText( int x, int y, const QString &str )将会在x和y参数确定的位置作为左边界可是写这个字符串。通常情况下给你的是左对齐的字符串。阿拉伯语和希伯来语的应用程序字符串是右对齐的,所以对于这些语言使用带有QRect的drawText(),因为这样的话函数就会根据语言在区域中画文字了。
- 当你写自己的文本输入控制时,使用QFontMetrics::charWidth()来确定字符串中字符的宽度。在一些语言中(主要是阿拉伯语),符号的宽度和形状的变化依赖于周围的字符。写输入控制通常需要它将要使用的脚本的知识。通常最容易的方式是继承QLineEdit或者QTextView。