【问题标题】:Simple way to display SVG image in a PyQt window在 PyQt 窗口中显示 SVG 图像的简单方法
【发布时间】:2016-05-09 19:40:28
【问题描述】:

我正在寻找一种在 PyQt 窗口中插入 SVG 图像的简单可靠的方法。更准确地说,我想知道是否可以将 SVG 图像应用于 QLabel。这可以用于 PNG 图像(参见下面的代码)。

import sys
from PyQt4 import QtGui

app = QtGui.QApplication(sys.argv)

label = QtGui.QLabel()
pixmap = QtGui.QPixmap('my_image.png')
label.setPixmap(pixmap)
label.show()

sys.exit(app.exec_())

编辑:

为了调整大小,我需要保留 SVG 图像的矢量方面。因此,在显示之前将图像转换为 PNG 并没有帮助。

【问题讨论】:

  • 我使用 GTK 而不是 Qt,但 this 看起来很相关。
  • 除了您链接的帖子显示了 Qt(不是 PyQt)的解决方案这一事实之外,它还用于将 SVG 转换为 PNG。我可能不够清楚,但这不是我需要的。我想保留矢量格式,以便调整图像大小。
  • 对不起。我希望它包含足够的信息让你适应 Python,但我知道这样做比拥有一个完全基于 Python 的解决方案有点混乱:我知道当我尝试做 GTK 时,通过基于 C 的东西查看是很痛苦的Python中的东西。但无论如何,我怀疑您必须在 Pixmap 中显示 SVG,这意味着您无法避免矢量到位图的转换。但是您的代码可以重新渲染 SVG 以响应缩放命令;这就是我在 GTK 中使用 SVG 所做的。
  • 啊,我第一次没有得到它:代码在运行时将 SVG 渲染为给定的比例。这实际上是一个很好的解决方案!我会尝试弄清楚如何为 python (PyQt) 编写这个。
  • 祝你好运!如果您遇到困难,您可以将新代码添加到您的问题中,或者只是提出一个新问题,可能会链接回这个问题。或者,如果您编写了一个不错的解决方案,请将其发布在此处作为答案:您可能会获得几点,它可能会对未来的读者有所帮助。

标签: python svg pyqt


【解决方案1】:

QLabel 只能加载像素图。如果您需要矢量图形,请使用 QtSvg.QSvgWidget() 并在不转换的情况下加载 svg 文件:

import sys
from PyQt4 import QtGui, QtSvg

app = QtGui.QApplication(sys.argv) 
svgWidget = QtSvg.QSvgWidget('Zeichen_123.svg')
svgWidget.setGeometry(50,50,759,668)
svgWidget.show()

sys.exit(app.exec_())

或直接由QtSvg.QSvgRenderer 渲染到QPaintDevice 的任何子类,例如给QLabel

app = QtGui.QApplication(sys.argv) 

widget = QtGui.QLabel()
widget.setGeometry(50,200,500,500)
renderer =  QtSvg.QSvgRenderer('Zeichen_123.svg')
widget.resize(renderer.defaultSize())
painter = QtGui.QPainter(widget)
painter.restore()
renderer.render(painter)
widget.show()

sys.exit(app.exec_())

get Zeichen_123.svg here

【讨论】:

  • 这正是我想要的!谢谢!我只是遇到了一个问题:我要显示的 SVG 图像包含文本并且它不会显示。我有黑盒子而不是字母......有什么想法吗?
  • 我认为,这可能是一个新问题。在您使用 svg 文件中的代码询问之前:其他查看器是否正确显示 svg 文件?是 svg 文件中的简单 -tags 还是 -tags?见:stackoverflow.com/questions/19391197/…
猜你喜欢
  • 2021-12-18
  • 2011-01-17
  • 1970-01-01
  • 2019-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
相关资源
最近更新 更多