pyqtgraph 中的 ScaleBar 不会设置 ParentItem

ScaleBar in pyqtgraph won't setParentItem

我正在尝试在 pyqtgraph/PyQt5 的 ImageView 中设置比例尺,但是当我为比例尺设置 ParentItem 时,它不接受 ImageView、ImageItem 或 ViewBox。没有错误信息,但整个程序崩溃了。

from PyQt5 import QtGui
import pyqtgraph as pg
import numpy as np

app = QtGui.QApplication([])

imvOCTTopLeft = pg.ImageView(view=pg.PlotItem())
imvOCTTopLeft.setImage(np.random.normal(size=(100,100)))
scale = pg.ScaleBar(size=0.1)
im=imvOCTTopLeft.getImageItem()
scale.setParentItem(im)

imvOCTTopLeft.show()

app.exec_()

我建议您在 CMD 或终端中执行您的代码,这样您可以获得有关错误的更多信息,如果您这样做,您将收到以下消息:

Traceback (most recent call last):
  File "/usr/lib/python3.7/site-packages/pyqtgraph/graphicsItems/GraphicsObject.py", line 23, in itemChange
    self.parentChanged()
  File "/usr/lib/python3.7/site-packages/pyqtgraph/graphicsItems/ScaleBar.py", line 44, in parentChanged
    view.sigRangeChanged.connect(self.updateBar)
AttributeError: 'ImageItem' object has no attribute 'sigRangeChanged'
Aborted (core dumped)

导致该错误的原因是 setParentItem() 方法需要一个 ViewBox,因为它具有 sigRangeChanged 信号,如果存在某种类型的缩放,该信号允许更新 ScaleBar。然后你可以通过视图属性获取 ViewBox,但是如果你像你所做的那样使用视图在构造函数中传递参数(pg.ImageView(view = pg.PlotItem())),那么你必须使用 getViewBox() 通过该对象获取视图框。

您的代码中的另一个错误是 QApplication 属于 PyQt5 的 QtWidgets 子模块。

from PyQt5 import QtWidgets
import pyqtgraph as pg
import numpy as np

if __name__ == '__main__':
    import sys

    app = QtWidgets.QApplication(sys.argv)

    imvOCTTopLeft = pg.ImageView(view=pg.PlotItem())
    imvOCTTopLeft.setImage(np.random.normal(size=(100,100)))
    scale = pg.ScaleBar(size=10)
    viewbox = imvOCTTopLeft.view
    if not isinstance(viewbox, pg.ViewBox): viewbox = viewbox.getViewBox()
    scale.setParentItem(viewbox)
    scale.anchor((1, 1), (1, 1), offset=(-200, -20))
    imvOCTTopLeft.show()

    sys.exit(app.exec_())