为什么Qt中的字体看起来模糊或像素化?

7

我的所有字体都显示为像素化,所以我使用了 AntiAliasing 但是并没有起到作用。就像你在图像中可以看到的那个像素化字体:

这是一个图片描述

这是我目前正在使用的代码:

butt1 = QtWidgets.QLabel("""Scrappr""")
font = QtGui.QFont()
font.setStyleStrategy(QtGui.QFont.PreferAntialias)
font.setPixelSize(22)
font.setFamily('Segoe UI Bold')
butt1.setFont(QtGui.QFont(font))

我在 SO, QtForums 等地方尝试了不同的解决方案,但都不起作用 :(

我尝试过:

  • 不同的 ClearType 文本 组合,但默认情况下在 Windows 和 Chrome 中所有文本都显示良好,但是Qt 中却变得像素化。

  • 将 Windows Aero 主题更改为经典主题...

但它们都没有帮助。

这是我的 PC 规格:

  • Windows: 7 Ultimate
  • PySide2 版本: 5.14.2.1
  • 分辨率: 1360 X 768

1
尝试使用QFont.PreferAntialiasPySide2.QtGui.QFont.setStyleStrategy来访问https://doc.qt.io/qtforpython/PySide2/QtGui/QFont.html#PySide2.QtGui.PySide2.QtGui.QFont.setStyleStrategy - Vladimir Bershov
1
我在Windows 10上遇到了同样的问题。当我使用Qt 5.13时,所有字体都被正确渲染。安装Qt 5.14后出现了这个问题。今天我安装了Qt 5.15,以为问题已经解决了,但是字体仍然和你描述的一样。我认为这是一个bug。 - INeed ADollar
好的...看来我不是一个人。谢谢你告诉我 @INeed-ADollar - Abhay Salvi
3个回答

8

我正在使用BrownPro字体,但在所有分辨率下文字都模糊不清,特别是在低分辨率下更加明显。

我通过将字体的提示偏好设置为:PreferNoHinting来解决了这个问题。在应用级别应用它可以在所有地方修复这个问题。

以下是文档链接:https://doc.qt.io/qt-5/qfont.html#HintingPreference-enum

这是我所使用的代码:

QFontDatabase::addApplicationFont(":/fonts/BrownPro-Bold.ttf");
QFontDatabase::addApplicationFont(":/fonts/BrownPro-Regular.ttf");
QFontDatabase::addApplicationFont(":/fonts/BrownPro-Light.ttf");

QFont brown_pro_font("BrownPro");
brown_pro_font.setHintingPreference(QFont::HintingPreference::PreferNoHinting); //This line did the trick
QApplication::setFont(brown_pro_font);

2
这绝对有效!同时使用Qt6。自从我设置了这个提示偏好后,文本显示效果(在Windows上)要好得多。 - Hans
我整天都在为这个问题苦恼,但是这个解决方案帮了我大忙。 - Lasse Nielsen

3

去年我恰巧使用了Qt,并使用qml构建了我的应用程序的UI部分。

Qt本身更喜欢我们使用qml来构建UI,因为他们编写了一个UI引擎,与旧引擎相比,它可以更好地呈现所有内容。

在PyQt中,您只使用Python方式,这通常不被推荐,但我并不是说qml版本是像素完美的。它在绘制曲线方面仍然效果不佳(但这通常不是我们需要的)。就您的问题而言,qml对您来说将很好地工作(它有更好的文本呈现)。

您可能会在寻找qml学习资源方面遇到一些困难。但至少试一试,是比仅使用Python方式更容易的。


1
使用旧方法构建的软件可能会在不同操作系统上产生不同的字体渲染效果。但是 QML 方法在所有操作系统上都具有相同的输出。 - Arish Khan
感谢回答@Arish-Khan。QML也能与PySide2一起使用吗? - Abhay Salvi
1
尝试这个:https://doc.qt.io/qtforpython/tutorials/basictutorial/qml.html - Arish Khan
我已经测试过了。它只适用于像"Arial"或"Times new"这样的字体,但不适用于"Helvetica"。现在我该怎么办?如果我使用Windows 10,能解决吗 :( @Arish-Khan - Abhay Salvi
1
好的,我不确定,我没有使用过Helvetica字体。我在QML中使用的字体是Roboto、Google Sans等...这些对我来说很好用,但我还没有测试过Helvetica。 - Arish Khan

2
尝试查看PyQt5使用的字体:
import PyQt5
from pyQt5 import QtGui
dir(QtGui.QFont)

结果将显示QFond所需的一切,可以使用的字体:
[..., 'Helvetica',...,'SansSerif',..., 'Serif',..., 'Times', ...

您可以尝试添加自定义字体,但需要测试每种字体。
例如,文档 告诉我们:
在 Windows 中,对“Courier”字体的请求会自动更改为“Courier New”,这是 Courier 的改进版本,可以实现平滑缩放。旧版 “Courier” 位图字体可通过设置 PreferBitmap 样式策略来选择(请参见 setStyleStrategy())。 找到字体后,其余属性将按优先顺序进行匹配:
fixedPitch()

pointSize() (see below)

weight()

style()

我只有一个问题。这是发生在Windows 7用户身上,还是Windows 10或macOS也有同样的问题? - Abhay Salvi
另外,我想补充一点,你提到的所有字体仍然有很多像素化的问题。我刚才已经试过它们了... - Abhay Salvi
1
这些字体默认由QFont使用,也许您的源代码存在问题。尝试使用完整的源代码或基本示例编辑您的问题,还可以尝试查看Courier New字体是否存在相同的问题,如果是,则可能是源代码或其他原因导致的。 - Cătălin George Feștilă
你需要找出Courier New字体为什么更好,可以查看关于Courier New的链接。祝你好运。 - Cătălin George Feștilă
无论字体有多好,对我来说它们仍然会呈现出像素化的效果 : ( 你提到了源代码... 接下来我该怎么做? - Abhay Salvi
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接