gpt4 book ai didi

python - PyQtGraph 中的图形在缩放后未更新

转载 作者:行者123 更新时间:2023-11-30 22:18:47 26 4
gpt4 key购买 nike

我有以下 PyQtGraph 程序,它在移动 slider 时使红色方 block “移动”:

import sys

from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QSlider
from pyqtgraph import (
mkBrush,
mkPen,
GraphicsObject,
QtGui,
PlotWidget,
)


class SquareItem(GraphicsObject):
def __init__(self):
super().__init__()
self.position_picture = QtGui.QPicture()

def paint(self, p, *args):
p.drawPicture(0, 0, self.position_picture)

def boundingRect(self):
return QtCore.QRectF(-5, -5, 20, 10)

def update_position(self, x):
self.position_picture = QtGui.QPicture()
painter = QtGui.QPainter(self.position_picture)
painter.scale(1, -1)
painter.setBrush(mkBrush('r'))
painter.setPen(mkPen(None))
painter.drawRect(QtCore.QRectF(x, 0, 1, 1))
painter.end()
self.informViewBoundsChanged()


class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)

self.setWindowTitle('Micromouse maze simulator')
self.resize(600, 600)

frame = QtWidgets.QFrame()
layout = QtWidgets.QVBoxLayout(frame)

self.graphics = PlotWidget()
self.graphics.setAspectLocked()
self.item = SquareItem()
self.graphics.addItem(self.item)

self.slider = QSlider(QtCore.Qt.Horizontal)
self.slider.setSingleStep(1)
self.slider.setPageStep(10)
self.slider.setRange(0, 10)
self.slider.setTickPosition(QSlider.TicksAbove)
self.slider.valueChanged.connect(self.slider_value_changed)
self.slider.setValue(1)

layout.addWidget(self.graphics)
layout.addWidget(self.slider)

self.setCentralWidget(frame)

def slider_value_changed(self, value):
self.item.update_position(value)


if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
main = MainWindow()
main.show()
sys.exit(app.exec_())

一切似乎都工作正常,但如果我放大/缩小,然后再次移动 slider ,方 block 位置将不再更新(即:方 block 不会重新绘制)。

我该如何解决这个问题?

更新

  • 我使用正方形来简化问题。实际上,我不仅可以更改位置,还可以绘制不同的形状,因此使用 setPos() 并不是一个真正的选择。

最佳答案

如果你想改变位置,你不应该更新绘画,你应该只使用 setPos()paint()函数需要 boundingRect()作为引用,因此在移动图形时,您将在该坐标系中移动它,而不是在PlotWidget的坐标系中移动它。 .

class SquareItem(GraphicsObject):
def paint(self, p, *args):
p.setBrush(mkBrush('r'))
p.setPen(mkPen(None))
p.drawRect(self.boundingRect())

def boundingRect(self):
return QtCore.QRectF(0, 0, 1, 1)

def update_position(self, x):
self.setPos(x, 0)


class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)

self.setWindowTitle('Micromouse maze simulator')
self.resize(600, 600)

frame = QtWidgets.QFrame()
layout = QtWidgets.QVBoxLayout(frame)

self.graphics = PlotWidget()
self.graphics.setAspectLocked()
self.item = SquareItem()
self.graphics.addItem(self.item)

self.graphics.setRange(rect=QtCore.QRectF(-10, -10, 20, 20))

self.slider = QSlider(QtCore.Qt.Horizontal)
self.slider.setSingleStep(1)
self.slider.setPageStep(10)
self.slider.setRange(0, 10)
self.slider.setTickPosition(QSlider.TicksAbove)
self.slider.valueChanged.connect(self.slider_value_changed)
self.slider.setValue(1)

layout.addWidget(self.graphics)
layout.addWidget(self.slider)

self.setCentralWidget(frame)

def slider_value_changed(self, value):
self.item.update_position(value)

如果您不打算使用信号,建议使用继承自 QGraphicsItem 的对象而不是QGraphicsObject ,例如您可以使用 QGraphicsRectItem :

import sys

from PyQt5 import QtCore, QtWidgets
from pyqtgraph import (
mkBrush,
mkPen,
GraphicsObject,
QtGui,
PlotWidget,
)

class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)

self.setWindowTitle('Micromouse maze simulator')
self.resize(600, 600)

frame = QtWidgets.QFrame()
layout = QtWidgets.QVBoxLayout(frame)

self.graphics = PlotWidget()
self.graphics.setAspectLocked()
self.item = QtWidgets.QGraphicsRectItem(0, 0, 1, 1)
self.item.setBrush(mkBrush('r'))
self.item.setPen(mkPen(None))
self.graphics.addItem(self.item)

self.graphics.setRange(rect=QtCore.QRectF(-10, -10, 20, 20))

self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
self.slider.setSingleStep(1)
self.slider.setPageStep(10)
self.slider.setRange(0, 10)
self.slider.setTickPosition(QtWidgets.QSlider.TicksAbove)
self.slider.valueChanged.connect(self.slider_value_changed)
self.slider.setValue(1)

layout.addWidget(self.graphics)
layout.addWidget(self.slider)

self.setCentralWidget(frame)

def slider_value_changed(self, value):
self.item.setPos(value, 0)


if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
main = MainWindow()
main.show()
sys.exit(app.exec_())
<小时/>

更新:

如果你想重画,你应该调用update() :

import sys

from PyQt5 import QtCore, QtWidgets

from pyqtgraph import (
mkBrush,
mkPen,
GraphicsObject,
QtGui,
PlotWidget,
)


class SquareItem(GraphicsObject):
colors = ['r', 'g', 'b', 'c', 'm', 'y', 'k', 'w', 'FF0', 'AA0', '0AA']
def __init__(self):
super().__init__()
self.mColor = SquareItem.colors[0]

def paint(self, p, *args):
p.setBrush(mkBrush(self.mColor))
p.setPen(mkPen(None))
p.drawRect(self.boundingRect())

def boundingRect(self):
return QtCore.QRectF(0, 0, 1, 1)

def update_draw(self, x):
self.mColor = SquareItem.colors[x]
self.update()


class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)

self.setWindowTitle('Micromouse maze simulator')
self.resize(600, 600)

frame = QtWidgets.QFrame()
layout = QtWidgets.QVBoxLayout(frame)

self.graphics = PlotWidget()
self.graphics.setAspectLocked()
self.item = SquareItem()
self.graphics.addItem(self.item)

self.graphics.setRange(rect=QtCore.QRectF(-10, -10, 20, 20))

self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
self.slider.setSingleStep(1)
self.slider.setPageStep(10)
self.slider.setRange(0, 10)
self.slider.setTickPosition(QtWidgets.QSlider.TicksAbove)
self.slider.valueChanged.connect(self.item.update_draw)
self.slider.setValue(1)

layout.addWidget(self.graphics)
layout.addWidget(self.slider)

self.setCentralWidget(frame)

if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
main = MainWindow()
main.show()
sys.exit(app.exec_())

关于python - PyQtGraph 中的图形在缩放后未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49264567/

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