我说昨天在QT3.3.8的Changelog里怎么没看到你说的这个变化呢……这么说,如果自己重新编译个libqt-mt就应该没问题了?(只用编译libqt-mt么?)f0rrest 写了:我上面没说清楚,这个patch (FcDefaultSubstitute(pattern);) 是debian/ubuntu引入的,如果用原版qt,至少没有在中文locale下,无法正确选择Sans Serif 字体的问题。
[问题]安装完Feisty后QT程序的字体替换无效了?
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
- dngpng
- 帖子: 25
- 注册时间: 2005-03-25 23:46
- 联系:
-
- 帖子: 133
- 注册时间: 2006-09-27 20:49
- dngpng
- 帖子: 25
- 注册时间: 2005-03-25 23:46
- 联系:
-
- 帖子: 133
- 注册时间: 2006-09-27 20:49
-
- 帖子: 157
- 注册时间: 2005-11-15 11:28
- 联系:
我也正为这个问题郁闷呢,呵呵,没想到有人能解决,看来只能重新编译libqt3-mt了,现在就动手:)
===============================
欢迎访问[记忆,过往……]http://TianYiSpace.cn !!
欢迎访问[记忆,过往……]http://TianYiSpace.cn !!
-
- 帖子: 157
- 注册时间: 2005-11-15 11:28
- 联系:
郁闷,新编译了也不成,en_US.UTF-8下选不到中文了,qt对fontconfig的支持太怪了,真是太怪了!
===============================
欢迎访问[记忆,过往……]http://TianYiSpace.cn !!
欢迎访问[记忆,过往……]http://TianYiSpace.cn !!
- dngpng
- 帖子: 25
- 注册时间: 2005-03-25 23:46
- 联系:
- dngpng
- 帖子: 25
- 注册时间: 2005-03-25 23:46
- 联系:
-
- 帖子: 133
- 注册时间: 2006-09-27 20:49
是不是upstream要看changelog啊,Qt从3.3.6开始就没动X11的字体引擎部分,现在这么多怪毛病哪来的呢? ubuntu在3.3.7引入的这个patch,一个是管字体宽度的,不会影响family的选择,另一个就是这个 FcDefaultSubstitute 了。wweeii 写了:qt被revert回3.3.7了,看来是upstream的问题,与FcDefaultSubstitute无关
那就来看看这个FcDefaultSubstitute 干了些什么,源代码我也没精力去读,从种种迹象标明,这个过程就是让fontconfig根据系统locale 来做字体替换(精确点是针对LC_CTYPE这个环境变量),而不是根据配置文件(就算alias里同时写上了英文和中文字体也不行)。这样一来,在LC_CTYPE=en时,系统在需要做字体替换时,只会去找一个属性lang包含en的字体,而不管它能不能用来显示其他语言。中文locale下也同样,结果是在做字体替换时,会用一个中文字体里的英文字来显示英文。
-
- 帖子: 21
- 注册时间: 2006-07-29 2:44
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版本的问题
问题是从upstream引入3.3.8开始出现的,那个patch从3.3.7就有了,那时候也没出现过问题
现在revert回3.3.7问题解决了,patch还在,所以我只能理解为3.3.8upstream版本的问题
-
- 帖子: 108
- 注册时间: 2005-11-06 16:54
qt3.3.8 在archlinux里也出现这个问题了。我是gbklocale的。反正3.3.8后,qt程序无法按照qtconfig的替换规则来替换中文字体,也不认fontconfig的顺序。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版本的问题
-
- 帖子: 133
- 注册时间: 2006-09-27 20:49
今天把qt-3.3.7和qt-3.3.8做了下diff,并重新编译,发现在src/kernel/qfontdatabase.cpp 中,如下变化导致了中文显示的一些异常:
这条语句在3.3.8里做了改动,结果是在纯英文Locale下(LANG=en_US.UTF-8),无法显示中文字体,同时在中文locale下,sans serif 字体无法根据fontconfig的配置匹配中文字体。
代码: 全选
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) {
-
- 帖子: 108
- 注册时间: 2005-11-06 16:54
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,