gpt4 book ai didi

python - 更改矩形的 X 值实际上并不会在 GUI 中移动它

转载 作者:行者123 更新时间:2023-12-01 00:06:10 26 4
gpt4 key购买 nike

我正在使用 PySide2 在 Python 中开发 GUI。我有一个 GraphicsView,我将在其中放置图像,并且我想在该图像上绘制和移动多边形。我发现了许多在 Python 中的 PySide、PySide2 或 PyQt 4/5 中简单绘制多边形、圆形等的示例。但是,我一直无法弄清楚为什么我的图形项目在不删除和重绘的情况下不会在事件中移动。

我正在使用键盘更改 PySide2 QRectF 上的 X 值。 X 值明显发生变化,但矩形实际上并未移动。

这是一个最小的例子:

from PySide2 import QtCore, QtGui, QtWidgets
from functools import partial

class DebuggingDrawing(QtWidgets.QGraphicsView):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

# initialize the scene and set the size
self._scene = QtWidgets.QGraphicsScene(self)
self._scene.setSceneRect(0,0,500,500)
self.setScene(self._scene)

# make a green pen and draw a 10 wide, 20 high rectangle at x=20, y=30
self.pen = QtGui.QPen(QtCore.Qt.green, 0)
self.draw_rect = QtCore.QRectF(20, 30, 10, 20)
# add the rectangle to our scene
self._scene.addRect(self.draw_rect, self.pen)

def move_rect(self, dx: int):
# method for moving the existing rectangle
# get the x value
x = self.draw_rect.x()
print('x: {} dx: {}'.format(x, dx))
# use the moveLeft method of QRectF to change the rectangle's left side x value
self.draw_rect.moveLeft(x + dx)
self.update()


class MainWindow(QtWidgets.QMainWindow):

def __init__(self):
super().__init__()
self.labelImg = DebuggingDrawing()

# Get a keyboard shortcut and hook it up to the move_rect method
next_shortcut = QtWidgets.QShortcut(QtGui.QKeySequence('Right'), self)
next_shortcut.activated.connect(partial(self.labelImg.move_rect, 1))

# get the left key shortcut, move_rect one pixel left
back_shortcut = QtWidgets.QShortcut(QtGui.QKeySequence('Left'), self)
back_shortcut.activated.connect(partial(self.labelImg.move_rect, -1))

self.setCentralWidget(self.labelImg)

self.setMaximumHeight(480)
self.update()

if __name__ == '__main__':
app = QtWidgets.QApplication([])
testing = MainWindow()
testing.show()
app.exec_()

输出如下:

enter image description here

您显然无法在图像中看到,但即使矩形的 x 值根据我们的打印调用而变化,图像中也没有任何移动。我已经确认这不仅仅是我的眼睛的问题,因为如果我在 move_rect 中绘制新的矩形,它们就会清楚地显示出来。

最佳答案

draw_rect 是一个 QRectF ,是创建由 QGraphicsRectItem 返回的项目 ( addRect() ) 的输入。方法类似于pen,即获取信息但之后不再使用它。这个想法是使用 setPos() 移动项目:

class DebuggingDrawing(QtWidgets.QGraphicsView):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

# initialize the scene and set the size
self._scene = QtWidgets.QGraphicsScene(self)
self._scene.setSceneRect(0, 0, 500, 500)
self.setScene(self._scene)

# make a green pen and draw a 10 wide, 20 high rectangle at x=20, y=30
pen = QtGui.QPen(QtCore.Qt.green, 0)
draw_rect = QtCore.QRectF(20, 30, 10, 20)
# add the rectangle to our scene
<b>self.item_rect = </b>self._scene.addRect(draw_rect, pen)

def move_rect(self, dx: int):
p = self.item_rect.pos()
p += QtCore.QPointF(dx, 0)
self.item_rect.setPos(p)

如果你仍然想使用draw_rect那么你必须在项目中再次设置它:

    self.pen = QtGui.QPen(QtCore.Qt.green, 0)
self.draw_rect = QtCore.QRectF(20, 30, 10, 20)
# add the rectangle to our scene
<b>self.item_rect = </b>self._scene.addRect(self.draw_rect, self.pen)

def move_rect(self, dx: int):
# method for moving the existing rectangle
# get the x value
x = self.draw_rect.x()
print('x: {} dx: {}'.format(x, dx))
# use the moveLeft method of QRectF to change the rectangle's left side x value
self.draw_rect.moveLeft(x + dx)
<b>self.item_rect.setRect(self.draw_rect)</b>

建议"Graphics View Framework"被读取以便 QGraphicsItems、QGraphicsView 和 QGraphicsScene 工作。

关于python - 更改矩形的 X 值实际上并不会在 GUI 中移动它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59959830/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com