在 PyQtGraph 和 PySide2 中使用 ImageView 固定文本位置

Fixed text position using an ImageView within PyQtGraph & PySide2

我正在使用 PyQtGraph 和 PySide2 显示平面 2D 图像和 3D 体积的 2D 切片(CT/MRI 体积数据集等),用户可以在其中 pan/zoom、滚动等

我想做的是在视图中的几个位置放置文本,覆盖图像,例如在角落 - 我可以指定的地方。 我希望此文本保持其屏幕位置,而不管图像 pan/zoom 等。 我还想在用户进行查看更改时实时更新其中的一些文本(例如查看像素大小等参数)

据我所知,最合适的选项是 LegendItem。有问题-

替代方法是 LabelItem 或 TextItem,但我找不到分配 screen 位置而不是 image[=37 的方法=] 位置。即-我如何指定 视图的左下角 window 而不是 image 的左下角 - 因为当然,图像可以移动。

-有没有办法固定 Label/Text 相对于视口的位置?

有趣的是,LabelItem 随图像平移和缩放,而 TextItem 仅随图像平移。

这是我的最低工作代码,其中包含每个文本内容的示例。

from PySide2.QtWidgets import QApplication
from PySide2.QtWidgets import QMainWindow
from PySide2.QtWidgets import QWidget
from PySide2.QtWidgets import QHBoxLayout

import pyqtgraph as pg
import numpy as np
import sys


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.cw = QWidget(self)
        self.cw.setAutoFillBackground(True)
        self.setCentralWidget(self.cw)

        self.layout = QHBoxLayout()
        self.cw.setLayout(self.layout)

        self.DcmImgWidget = MyImageWidget(parent=self)
        self.layout.addWidget(self.DcmImgWidget)

        self.show()


class MyImageWidget(pg.ImageView):
    def __init__(self, parent):
        super().__init__(parent, view=pg.PlotItem())

        self.ui.histogram.hide()
        self.ui.roiBtn.hide()
        self.ui.menuBtn.hide()

        plot_view = self.getView()
        plot_view.hideAxis('left')
        plot_view.hideAxis('bottom')

        # 50 frames of 100x100 random noise
        img = np.random.normal(size=(50, 100, 100))
        self.setImage(img)

        text0 = pg.LabelItem("this is a LabelItem", color=(128, 0, 0))
        text0.setPos(25, 25)  # <---- These are coords within the IMAGE
        plot_view.addItem(text0)

        text1 = pg.TextItem(text='This is a TextItem', color=(0, 128, 0))
        plot_view.addItem(text1)
        text1.setPos(75, -20)  # <---- These are coords within the IMAGE

        legend = plot_view.addLegend()
        style = pg.PlotDataItem(pen='w')
        legend.addItem(style, 'legend')


def main():
    app = QApplication(sys.argv)
    main = MainWindow()
    main.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

一种可能的解决方案是将 QLabel 添加到 ImageView 使用的 QGraphicsView 的视口中:

class MyImageWidget(pg.ImageView):
    def __init__(self, parent):
        super().__init__(parent, view=pg.PlotItem())

        self.ui.histogram.hide()
        self.ui.roiBtn.hide()
        self.ui.menuBtn.hide()

        plot_view = self.getView()
        plot_view.hideAxis("left")
        plot_view.hideAxis("bottom")

        # 50 frames of 100x100 random noise
        img = np.random.normal(size=(50, 100, 100))
        self.setImage(img)

        label = QLabel("this is a QLabel", self.ui.graphicsView.viewport())
        label.move(25, 25)