[问题]安装完Feisty后QT程序的字体替换无效了?

系统安装、升级讨论
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
头像
dngpng
帖子: 25
注册时间: 2005-03-25 23:46
联系:

#16

帖子 dngpng » 2007-03-20 22:48

f0rrest 写了:我上面没说清楚,这个patch (FcDefaultSubstitute(pattern);) 是debian/ubuntu引入的,如果用原版qt,至少没有在中文locale下,无法正确选择Sans Serif 字体的问题。 :?
我说昨天在QT3.3.8的Changelog里怎么没看到你说的这个变化呢……这么说,如果自己重新编译个libqt-mt就应该没问题了?(只用编译libqt-mt么?)
f0rrest
帖子: 133
注册时间: 2006-09-27 20:49

#17

帖子 f0rrest » 2007-03-21 3:15

我是直接 apt-get source 下载源码,把里面 61_fcfontmatch_fontwidth_fix.dpatch 这个文件里的那句 FcDefaultSubstitute(pattern); 去掉,再dpkg-buildpackage 。比较愚昧,不知道怎么单独编译libqt3-mt 这个包。
头像
dngpng
帖子: 25
注册时间: 2005-03-25 23:46
联系:

#18

帖子 dngpng » 2007-03-21 9:15

反正我在Launchpad加了一个:https://launchpad.net/bugs/94282

另外,重新编译后在纯英文locale下是什么情况?
f0rrest
帖子: 133
注册时间: 2006-09-27 20:49

#19

帖子 f0rrest » 2007-03-22 3:53

对于纯英文locale,重新编译之前和中文locale一个德行,即对于Sans Serif 字体,无视fontconfig的配置而去找按照字母顺序排第一个的英文字体,我这里就是:Bitstream Vera Sans ,就连Serif 和 Monospace 字体也选这个。

编译去掉那条语句后,就认fontconfig的配置了。
leo_tzao
帖子: 157
注册时间: 2005-11-15 11:28
联系:

#20

帖子 leo_tzao » 2007-03-23 12:31

我也正为这个问题郁闷呢,呵呵,没想到有人能解决,看来只能重新编译libqt3-mt了,现在就动手:)
leo_tzao
帖子: 157
注册时间: 2005-11-15 11:28
联系:

#21

帖子 leo_tzao » 2007-03-24 12:45

郁闷,新编译了也不成,en_US.UTF-8下选不到中文了,qt对fontconfig的支持太怪了,真是太怪了!
头像
dngpng
帖子: 25
注册时间: 2005-03-25 23:46
联系:

#22

帖子 dngpng » 2007-03-26 4:19

我也去掉cDefaultSubstitute(pattern)重新编译了,在en_US.UTF-8下还是不行
wweeii
帖子: 21
注册时间: 2006-07-29 2:44

#23

帖子 wweeii » 2007-03-27 0:43

qt被revert回3.3.7了,看来是upstream的问题,与FcDefaultSubstitute无关
头像
dngpng
帖子: 25
注册时间: 2005-03-25 23:46
联系:

#24

帖子 dngpng » 2007-03-27 1:54

我刚刚安了这个所谓的“3.3.8really3.3.7-0ubuntu1”的版本,发现所有QT程序的界面全变得特别难看,而且Kontrol里也选默认的那个Plastik也没用了。 (当然,可以暂时用polymer)

不过有一点让人欣慰的是,这个QT版本渲染字体时优先考虑fontconfig,我把~/.fonts.conf稍微变一点,重启一下amarok就能体现出变化来。记得Edgy里的QT还优先考虑qtconfig的字体替换规则呢。
f0rrest
帖子: 133
注册时间: 2006-09-27 20:49

#25

帖子 f0rrest » 2007-03-27 3:58

wweeii 写了:qt被revert回3.3.7了,看来是upstream的问题,与FcDefaultSubstitute无关
是不是upstream要看changelog啊,Qt从3.3.6开始就没动X11的字体引擎部分,现在这么多怪毛病哪来的呢? ubuntu在3.3.7引入的这个patch,一个是管字体宽度的,不会影响family的选择,另一个就是这个 FcDefaultSubstitute 了。

那就来看看这个FcDefaultSubstitute 干了些什么,源代码我也没精力去读,从种种迹象标明,这个过程就是让fontconfig根据系统locale 来做字体替换(精确点是针对LC_CTYPE这个环境变量),而不是根据配置文件(就算alias里同时写上了英文和中文字体也不行)。这样一来,在LC_CTYPE=en时,系统在需要做字体替换时,只会去找一个属性lang包含en的字体,而不管它能不能用来显示其他语言。中文locale下也同样,结果是在做字体替换时,会用一个中文字体里的英文字来显示英文。
wweeii
帖子: 21
注册时间: 2006-07-29 2:44

#26

帖子 wweeii » 2007-03-27 4:24

apt上的changelog不包括qt本身有过什么改变啊(qt3.3.8的changelog http://www.trolltech.com/developer/note ... ges-3.3.8/),只是有debian/ubuntu自己的patch的更新
问题是从upstream引入3.3.8开始出现的,那个patch从3.3.7就有了,那时候也没出现过问题
现在revert回3.3.7问题解决了,patch还在,所以我只能理解为3.3.8upstream版本的问题
yqh1203
帖子: 108
注册时间: 2005-11-06 16:54

#27

帖子 yqh1203 » 2007-03-31 4:25

wweeii 写了:apt上的changelog不包括qt本身有过什么改变啊(qt3.3.8的changelog http://www.trolltech.com/developer/note ... ges-3.3.8/),只是有debian/ubuntu自己的patch的更新
问题是从upstream引入3.3.8开始出现的,那个patch从3.3.7就有了,那时候也没出现过问题
现在revert回3.3.7问题解决了,patch还在,所以我只能理解为3.3.8upstream版本的问题
qt3.3.8 在archlinux里也出现这个问题了。我是gbklocale的。反正3.3.8后,qt程序无法按照qtconfig的替换规则来替换中文字体,也不认fontconfig的顺序。
f0rrest
帖子: 133
注册时间: 2006-09-27 20:49

#28

帖子 f0rrest » 2007-04-03 3:36

今天把qt-3.3.7和qt-3.3.8做了下diff,并重新编译,发现在src/kernel/qfontdatabase.cpp 中,如下变化导致了中文显示的一些异常:

代码: 全选

diff -ruN qt-x11-free-3.3.8/src/kernel/qfontdatabase.cpp qt-x11-free-3.3.8/src/kernel/qfontdatabase.cpp
--- qt-x11-free-3.3.8/src/kernel/qfontdatabase.cpp    2006-10-19 16:25:15.000000000 +0200
+++ qt-x11-free-3.3.8/src/kernel/qfontdatabase.cpp        2007-02-02 15:01:13.000000000 +0100
@@ -957,7 +958,7 @@
     parseFontName( request.family, foundry_name, family_name );

 #ifdef Q_WS_X11
-    if (family_name.isEmpty() && script == QFont::Han) {
+    if (script == QFont::Han) {
        // modify script according to locale
        static QFont::Script defaultHan = QFont::UnknownScript;
        if (defaultHan == QFont::UnknownScript) {
这条语句在3.3.8里做了改动,结果是在纯英文Locale下(LANG=en_US.UTF-8),无法显示中文字体,同时在中文locale下,sans serif 字体无法根据fontconfig的配置匹配中文字体。
yqh1203
帖子: 108
注册时间: 2005-11-06 16:54

#29

帖子 yqh1203 » 2007-04-07 19:35

archlinux最新的qt已经修复这个问题了。patch应该是这个:

代码: 全选

--- src/kernel/qfontdatabase_x11.cpp
+++ src/kernel/qfontdatabase_x11.cpp
@@ -1589,15 +1589,6 @@ QFontEngine *loadEngine( QFont::Script s
if (script == QFont::Latin)
// add Euro character
FcCharSetAddChar(cs, 0x20ac);
- if (script == QFont::Han_SimplifiedChinese)
- FcCharSetAddChar(cs, 0x3400);
- if (script == QFont::Han_TraditionalChinese){
- FcCharSetAddChar(cs, 0x3435);
- FcCharSetAddChar(cs, 0xE000);
- FcCharSetAddChar(cs, 0xF6B1);
- }
- if (script == QFont::MiscellaneousSymbols)
- FcCharSetAddChar(cs, 0x2714);
FcPatternAddCharSet(pattern, FC_CHARSET, cs);
FcCharSetDestroy(cs);
}
@@ -1813,7 +1804,11 @@ static QFontEngine *loadFontConfigFont(c
FcPatternPrint(pattern);
#endif

+ // XftFontMatch calls the right ConfigSubstitute variants, but as we use
+ // FcFontMatch/Sort here we have to do it manually.
FcConfigSubstitute(0, pattern, FcMatchPattern);
+ XftDefaultSubstitute(QPaintDevice::x11AppDisplay(), QPaintDevice::x11AppScreen(), pattern);
+
// qDebug("1: pattern contains:");
// FcPatternPrint(pattern);

@@ -1847,10 +1842,6 @@ static QFontEngine *loadFontConfigFont(c
value.u.s = (const FcChar8 *)cs.data();
FcPatternAddWeak(pattern, FC_FAMILY, value, FcTrue);
}
-#ifdef FONT_MATCH_DEBUG
- printf("final pattern contains:\n");
- FcPatternPrint(pattern);
-#endif
}

if (script != QFont::Unicode) {
@@ -1860,19 +1851,15 @@ static QFontEngine *loadFontConfigFont(c
if (script == QFont::Latin)
// add Euro character
FcCharSetAddChar(cs, 0x20ac);
- if (script == QFont::Han_SimplifiedChinese)
- FcCharSetAddChar(cs, 0x3400);
- if (script == QFont::Han_TraditionalChinese) {
- FcCharSetAddChar(cs, 0x3435);
- FcCharSetAddChar(cs, 0xE000);
- FcCharSetAddChar(cs, 0xF6B1);
- }
- if (script == QFont::MiscellaneousSymbols)
- FcCharSetAddChar(cs, 0x2714);
FcPatternAddCharSet(pattern, FC_CHARSET, cs);
FcCharSetDestroy(cs);
}

+#ifdef FONT_MATCH_DEBUG
+ printf("final pattern contains:\n");
+ FcPatternPrint(pattern);
+#endif
+
QFontEngine *fe = 0;

for( int jj = (FcGetVersion() >= 20392 ? 0 : 1); jj < 2; ++jj ) {
--- src/kernel/qfontdatabase.cpp
+++ src/kernel/qfontdatabase.cpp
@@ -554,7 +554,7 @@ static const unsigned short sample_chars
// GeometricSymbols,
{ 0x2500, 0x0 },
// MiscellaneousSymbols,
- { 0x2640, 0x0 },
+ { 0x2640, 0x2714, 0x0 },
// EnclosedAndSquare,
{ 0x2460, 0x0 },
// Braille,
回复