【问题标题】:Using SVG icons on HiDPI displays in PyQt5在 PyQt5 中的 HiDPI 显示器上使用 SVG 图标
【发布时间】:2020-02-14 05:17:18
【问题描述】:

我想在我的 PyQt5 应用程序中使用高分辨率图标。但是,下面的代码 sn-p 在我的 HiDPI macOS 平台上产生了一个非常低分辨率的渲染(需要的图标可以下载here):

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction
from PyQt5.QtGui import QIcon


app = QApplication(sys.argv)
main = QMainWindow()
icon = QIcon("waves-24px.svg")
action = QAction(icon, "Test")
toolbar = main.addToolBar("toolbar")
toolbar.addAction(action)
toolbar.show()
main.show()
sys.exit(app.exec_())

这是结果的样子(注意图标的低分辨率):

我做错了什么?

【问题讨论】:

  • 你用的是什么版本的 PyQt5?
  • 尝试在app = ...之前添加os.environ["QT_AUTO_SCREEN_SCALE_FACTOR"] = "1"
  • 不幸的是这个环境变量没有效果。
  • 有趣的是,即使我加载从 Inkscape 导出的 240x240 PNG,我也会得到一个低分辨率的图标。也许QIcon 总是在缩减规模?

标签: python svg pyqt pyqt5 hidpi


【解决方案1】:

原来有一个简单的解决方案:

app.setAttribute(Qt.AA_UseHighDpiPixmaps)

【讨论】:

    【解决方案2】:

    从 SVG 加载图标时,QT 首先将其渲染为像素图。默认情况下,像素图的尺寸取自 svg 页面大小,即 svg 根元素的宽度和高度属性。为您的 svg 渲染器生成 24px x 24px 像素图。因此,Qt 首先将您的图片加载到低分辨率缓冲区中,然后再缩放 ins 内容。要解决此问题,请尝试放大 svg 的宽度和高度属性以增加页面大小和缩放图像。在 Inkscape 中,页面大小设置位于文件 > 文档属性 > 页面选项卡中。

    【讨论】:

    • 我可以将页面大小增加到例如240x240,但实际图像无法缩放 - 我该怎么做?
    • 将 svg xml 中的路径元素放入组元素 并添加转换:<svg xmlns="http://www.w3.org/2000/svg" width="240" height="240" viewBox="0 0 240 240"><g id="group" transform="scale(10)"><path ... /></g></svg>
    • 图标仍然以相同的低分辨率呈现(我什至在widthheightviewBox 字段中尝试了scale(100)2400)。
    猜你喜欢
    • 1970-01-01
    • 2021-02-18
    • 2013-03-13
    • 2019-11-24
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多