【问题标题】:Why fonts in Qt are appearing blurry or pixelated?为什么 Qt 中的字体看起来模糊或像素化?
【发布时间】:2020-08-25 02:54:20
【问题描述】:

我所有的字体都出现了像素化,所以我使用了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 text 的不同组合,但效果不佳,默认情况下,所有文本在 windows 和 chrome 上看起来都很好只有Qt,它会变得像素化。

  • 将 windows aero 主题更改为经典主题...

但他们都没有帮助。

这是我的电脑规格:

  • windows:7 终极版
  • PySide2 版本:5.14.2.1
  • 分辨率:1360 X 768

【问题讨论】:

  • 试试doc.qt.io/qtforpython/PySide2/QtGui/…QFont.PreferAntialias
  • 我在 Windows 10 上遇到了同样的问题。当我使用 Qt 5.13 时,所有字体都正确呈现。安装 Qt 5.14 后出现此问题。今天我安装了Qt 5.15,以为问题已经解决了,但是字体是一样的,就像你描述的那样。我认为这是一个错误。
  • 好吧...看来我不是一个人在这里。谢谢你让我知道 ???? @INeed-ADollar

标签: python-3.x windows qt fonts pyqt5


【解决方案1】:

我使用的是 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);

【讨论】:

  • 这绝对有效!也使用Qt6。因为我设置了这个提示首选项,所以文本显示得更好(在 Windows 上)。
【解决方案2】:

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

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

在 PyQt 的情况下,您使用的是通常不推荐的仅 python 方法,我并不是说 qml 版本是像素完美的。它在绘制曲线方面仍然很糟糕(但这不是我们通常需要的东西)。就您的问题而言,qml 对您来说可以正常工作(它具有更好的文本渲染)。

您可能很难找到 qml 的学习资源。但至少试一试,是的,它比仅使用 Python 的方法要容易得多。

【讨论】:

  • 使用旧方法构建的软件可能会在不同的操作系统上产生不同的字体渲染。但是 qml 方法在所有操作系统上都有相同的输出
  • 感谢您回答@Arish-Khan QML 是否也与PySide2 一起工作?
  • 嗯,我已经测试过了。它仅适用于“Arial”或“Times new”等字体,但不适用于“Helvetica”。我现在该怎么办?如果我使用 Windows 10 会解决吗:(@Arish-Khan
  • 我不确定,我没有使用过 Helvetica。我与 qml 一起使用的字体是 Roboto、Google Sans 等……对我来说效果很好,但我还没有测试过 Helvetica
【解决方案3】:

尝试查看 PyQt5 使用的字体:

import PyQt5
from pyQt5 import QtGui
dir(QtGui.QFont)

结果将显示您对 QFond 的所有需求,并且可以使用字体:

[..., 'Helvetica',...,'SansSerif',..., 'Serif',..., 'Times', ...

您可以尝试添加自定义字体,但您需要测试每种字体。

例如,the documentation 告诉我们:

在 Windows 中,对“Courier”字体的请求会自动更改为“Courier New”,这是 Courier 的改进版本,允许平滑缩放。可以通过设置 PreferBitmap 样式策略来选择较旧的“Courier”位图字体(参见 setStyleStrategy() )。 一旦找到一种字体,剩余的属性就会按照优先级的顺序进行匹配:

fixedPitch()

pointSize() (see below)

weight()

style()

【讨论】:

  • 我只有一个问题。 Windows 7 用户是否会发生这种情况,或者 Windows 10 或 macOS 也有同样的问题?
  • 另外,我想补充一点,你提到的所有字体仍然是像素化的(我的意思是很多)。我现在都试过了......
  • QFont默认使用这些字体,可能你的源代码有问题。尝试使用完整的源代码或基本示例编辑您的问题,如果有相同的问题,也尝试查看 Courier New 字体,那么它来自源代码或其他内容。
  • 是的,Courier New确实有同样的问题!!现在该怎么办?
  • 您需要找到Courier New为什么更好的原因,请参见Courier New的链接。祝你好运。
猜你喜欢
  • 2020-10-09
  • 2016-04-22
  • 1970-01-01
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
相关资源
最近更新 更多