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

2024-10-01 09:36:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我想做的是在视图中的几个位置有文本,覆盖在图像上,例如在角落里——我可以指定的地方。 我希望此文本保持其屏幕位置,而不考虑图像平移/缩放等。 我还希望在用户进行查看更改(例如查看参数,如像素大小)时实时更新部分文本

在我看来,最合适的选择是一个传奇项目。存在以下问题:

  • 如何禁用用户拖动
  • 如何控制文本位置?.setPos()方法无效
  • 如何删除/隐藏图例文本左侧的行

另一种选择是LabelItem或TextItem,尽管我找不到一种方法来分配屏幕位置,而不是图像位置。ie-如何指定视图窗口的左下角而不是图像的左下角-当然,图像可以移动

-是否有方法固定相对于视口的标签/文本位置

有趣的是,LabelItem pans&;缩放图像,而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()

Tags: from图像文本importselfviewplotinit
1条回答
网友
1楼 · 发布于 2024-10-01 09:36:51

一种可能的解决方案是将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)

相关问题 更多 >