首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyQtGraph ROI RemoveHandle不删除椭圆ROI的圆形句柄

PyQtGraph ROI RemoveHandle不删除椭圆ROI的圆形句柄
EN

Stack Overflow用户
提问于 2022-05-30 18:21:37
回答 1查看 184关注 0票数 1

我的目标是编码一个不能旋转的椭圆ROI。考虑从其中一个PyQtGraph示例修改的以下代码:

代码语言:javascript
复制
import numpy as np
import cv2
import pyqtgraph as pg
from PyQt5 import QtGui
import numpy.ma as ma
from PyQt5.QtWidgets import QMessageBox

pg.setConfigOptions(imageAxisOrder='row-major')

## Create image to display
image = cv2.imread('panda.jpg')


def picturetranspose(picture):
    shape = picture.shape
    result = np.empty((shape[1],shape[0],shape[2]),dtype= np.uint8)
    for i in range(0,3):
        result[:,:,i] = np.transpose(picture[:,:,i])
    return result
    
arr = np.rot90(picturetranspose(image))
app = pg.mkQApp("ROI Examples")
w = pg.GraphicsLayoutWidget(show=True, size=(1000,800), border=True)
w.setWindowTitle('pyqtgraph example: ROI Examples')
w1 = w.addLayout(row=0, col=0)
v1a = w1.addViewBox(row=1, col=0, lockAspect = True)
v1a.setLimits(minXRange = arr.shape[0]//10, minYRange = arr.shape[1]//10, maxXRange = 5*arr.shape[0], maxYRange = 5*arr.shape[1])
img1a = pg.ImageItem(arr)
v1a.addItem(img1a)

rois = []
x=pg.EllipseROI([60, 10], [30, 20], pen=pg.mkPen('b', width=5),rotatable = False)
x.removeHandle(0)
rois.append(x)

for roi in rois:
    roi.sigRegionChanged.connect(img1a.setImage(arr))
    v1a.addItem(roi)

img1a.setImage(arr)

这里的图像"panda.jpg“是由:uRX2JvlruMKvPX?usp=sharing提供的。运行代码并移动ROI将提供:

通过单击方形浅蓝手柄,可以更改ROI的大小。由于我设置了rotatable = False,ROI无法旋转,单击循环句柄将不会旋转ROI。

但是,行x.removeHandle(0)应该删除浅蓝色的圆形手柄,这样它就不会出现在屏幕上。这是个虫子吗?我错过了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-01 02:11:52

当创建一个QGraphicsItem时,它不会立即添加到场景中,在那个时间框架内,一些与场景相关的方面将被“存储”,直到项目被实际放到场景中为止。其中一些属性非常明显(例如项位置),但其他属性则不明显。其中之一是添加子项。当一个“主”项目被添加到场景中时,它的所有子代(和孙子、曾孙等)都会被添加到场景中。都和它一起添加。

这就是创建ROI时所发生的情况:它的句柄是在它的__init__中创建的(参见资料来源),但是只有当ROI实际上有一个scene()时,removeHandle()才会从场景中移除句柄。

请记住,PyQt (和PySide)是Qt的绑定,这意味着我们总是使用C++对象的。即使删除了对python对象的最后一次引用,实际上也只删除了python对象,但是如果该对象是C++对象的包装器,并且该对象具有父对象,则实际对象毕竟不会被删除。

虽然pyqtGraph将句柄从其内部列表中移除,但表示句柄的C++对象仍然作为ROI的子对象存在,因此,当ROI被添加到场景时,句柄仍然存在。

一个可能的解决方案是在将ROI添加到场景后移除手柄:

代码语言:javascript
复制
for roi in rois:
    roi.sigRegionChanged.connect(img1a.setImage(arr))
    v1a.addItem(roi)
    roi.removeHandle(0)

这是因为removeHandle只在项目的场景存在时才移除句柄,这样子项才能实际从场景中移除。

注意,根据源,EllipseROI添加了两个句柄:旋转和缩放。您可能想要删除所有这些内容:

代码语言:javascript
复制
for roi in rois:
    roi.sigRegionChanged.connect(img1a.setImage(arr))
    v1a.addItem(roi)
    while roi.handles:
        roi.removeHandle(0)

我建议您在吡咯烷图储存库上提交一份关于这一点的报告,在他们这边解决这个问题应该相当容易。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72438584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档