Я очень новичок в Python и PyQT и застрял. Так что извиняюсь, если мой код немного беспорядок. Я провел довольно много времени в поисках, но пока не нашел ничего, что помогло бы моей ситуации.
Я пытаюсь определить, на каком эллипсе щелкнули.
У меня в основном есть раздел, который создает эллипсы в круге и печатает текст поверх него на основе значений из массива списков:
class MyFrame(QtWidgets.QGraphicsView):
def __init__(self, parent = None ):
super(MyFrame, self).__init__(parent)
self.setScene(QtWidgets.QGraphicsScene())
self.setBackgroundBrush(QtGui.QColor(QtCore.Qt.darkGray))
self.setRenderHints(self.renderHints() | QtGui.QPainter.Antialiasing | QtGui.QPainter.SmoothPixmapTransform)
arLights = list( {} for i in xrange(12) )
circX = 0
circY = 0
maxX = 0
maxY = 0
i = 0
pen = QtGui.QPen(QtGui.QColor(QtCore.Qt.lightGray).darker(50))
brush = QtGui.QBrush(QtGui.QColor(QtCore.Qt.lightGray))
font = QtGui.QFont('White Rabbit')
font.setPointSize(12)
arLights = getLights()
theta = radians(360)
columns = len(filter(None, arLights))
alpha = theta / columns
for a in range(columns):
angle = a * alpha
circX = (w + x) * cos(angle)
circY = (h + y) * sin(angle)
item = callbackEllipse(circX, circY, w, h) #(x+xi*(w+x), y+yi*(h+y), w, h)
item.setAcceptHoverEvents(True)
item.setPen(pen)
item.setBrush(brush)
self.scene().addItem(item)
item.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable)
self.writeText(arrLight[i]['name'], circX + (w / 4), circY + (h * 0.75))
i = i + 1
Это мой mouseReleaseEvent, где я пытаюсь определить имя, связанное с этим эллипсом, используя ту же формулу, что и для их разметки.
class callbackEllipse(QtWidgets.QGraphicsEllipseItem):
def mouseReleaseEvent(self, event):
# recolor on click
color = QtGui.QColor(QtCore.Qt.lightGray)
brush = QtGui.QBrush(color)
QtWidgets.QGraphicsEllipseItem.setBrush(self, brush)
theta = radians(360)
alpha = theta / arrRange
arrLights = getLights()
for a in xrange(0, len(filter(None, arrLights))):
if (event.scenePos().x() > ((w + x) * cos(a * alpha))
and event.scenePos().x() < (((w + x) * cos(a * alpha)) + w)
and event.screenPos().y() < ((h + y) * sin(a * alpha))
and event.screenPos().y() < (((h + y) * sin(a * alpha)) + h)
):
print(arrLights[a]['name'])
break
return QtWidgets.QGraphicsEllipseItem.mouseReleaseEvent(self, event)
Это не работает, как задумано. Я пробовал .sceenPos () .screenPos () и .pos (), но они не совпадают с координатами, когда я создавал эллипсы, в результате чего он идентифицировал неверно связанный текст или не нашел совпадать вообще.
Может ли кто-нибудь помочь мне идентифицировать эллипс или почему мой код работает не так, как я хочу? Кажется, нет способа «назвать» их, что было бы проще.