Масштабирование сетки в pyqtgraph с использованием GLGridItem и GLViewWidget
Вопрос довольно специфический и касается pyqtgraph. Мне необходимо реализовать масштабирование координатной сетки GLGridItem. Т.е. чтобы при движении колёсика мыши изменялась частота линий сетки (при приближении — частота увеличивала, при отдалении — уменьшалась). Для этого я написала класс, который наследуется одновременно от GLGridItem и GLViewWidget, т.к. GLGridItem не имеет функции события для нажатия клавиш, а в GLViewWidget есть функция wheelEvent.
Однако при запуске кода выдаётся ошибка Process finished with exit code -1073741819 (0xC0000005), т.е. null pointer exeption. При дебаге я поняла, что когда вызывается функция gl.GLGridItem.__init__(self), класс GLGridItem вызывает GLGraphicsItem.__init__. И как раз в этот момент программа падает.
В классе GLGridItem в __init__ нет параметра родителя parentItem, а в классе GLGraphicsItem он есть. И т.к. значение родителя по умолчанию None и оно не изменяется, то программа падает. Т.е. null pointer как раз этот родитель.
Прошу помочь исправить данный баг.
class MyGLGridItem(gl.GLGridItem, gl.GLViewWidget):
def __init__(self, parent = None):
gl.GLGridItem.__init__(self)
gl.GLViewWidget.__init__(self, parent=parent)
self.setGLOptions('translucent')
self.setColor("lightslategray")
self.__spacing = [1, 1, 1]
self.setSpacing(self.__spacing)
self.scale_iterator = 0
def wheelEvent(self, ev):
delta = ev.angleDelta().x()
if delta == 0:
delta = ev.angleDelta().y()
if ev.modifiers() & QtCore.Qt.KeyboardModifier.ControlModifier:
self.opts['fov'] *= 0.999 ** delta
else:
if delta > 0:
self.scale_iterator += 1
else:
self.scale_iterator -= 1
self.opts['distance'] *= 0.999 ** delta
if self.scale_iterator == 5:
self.doubleUpSpacing(self.__spacing)
self.scale_iterator = 0
elif self.scale_iterator == -5:
self.doubleDownSpacing(self.__spacing)
self.scale_iterator = 0
self.update()
def doubleUpSpacing(self, x=None, y=None, z=None, spacing=None):
if spacing is not None:
x = spacing.x() * 2
y = spacing.y() * 2
z = spacing.z() * 2
self.__spacing = [x, y, z]
self.update()
def doubleDownSpacing(self, x=None, y=None, z=None, spacing=None):
if spacing is not None:
x = spacing.x() // 2
y = spacing.y() // 2
z = spacing.z() // 2
self.__spacing = [x, y, z]
self.update()