Determine which ellipse in click event












1















I'm very new to python and PyQT and have become stuck. So apologies if my code is a bit of a mess. I have spent quite some time searching but haven't yet found anything that helps my situation.



I'm trying to identify which ellipse was clicked.



I basically have a section that creates ellipses in a circle and prints text over it based on values from an array of lists:



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


This is my mouseReleaseEvent, where I am then trying to work out the name associated with that ellipse by using the same formula that I used to lay them out.



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)


This doesn't work as intended. I've tried .sceenPos() .screenPos() and .pos() but they don't appear to match up with the co-ordinates from when I created the ellipses, resulting in it identifying the wrong associated text or not finding a match at all.



Can anyone help me with a way to identify the ellipse or what why my code isn't working the way I want it to? There doesn't seem to be a way to 'name' them, which would be easier.










share|improve this question

























  • whats is getLights?

    – eyllanesc
    Nov 19 '18 at 23:59











  • It’s a defined function that returns an array of dictionaries with details of Hive lights: [0] { “name” : “value”, “id” : “value”, “status” : Boolean, “brightness” : “value” }

    – xnemesis
    Nov 20 '18 at 17:14


















1















I'm very new to python and PyQT and have become stuck. So apologies if my code is a bit of a mess. I have spent quite some time searching but haven't yet found anything that helps my situation.



I'm trying to identify which ellipse was clicked.



I basically have a section that creates ellipses in a circle and prints text over it based on values from an array of lists:



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


This is my mouseReleaseEvent, where I am then trying to work out the name associated with that ellipse by using the same formula that I used to lay them out.



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)


This doesn't work as intended. I've tried .sceenPos() .screenPos() and .pos() but they don't appear to match up with the co-ordinates from when I created the ellipses, resulting in it identifying the wrong associated text or not finding a match at all.



Can anyone help me with a way to identify the ellipse or what why my code isn't working the way I want it to? There doesn't seem to be a way to 'name' them, which would be easier.










share|improve this question

























  • whats is getLights?

    – eyllanesc
    Nov 19 '18 at 23:59











  • It’s a defined function that returns an array of dictionaries with details of Hive lights: [0] { “name” : “value”, “id” : “value”, “status” : Boolean, “brightness” : “value” }

    – xnemesis
    Nov 20 '18 at 17:14
















1












1








1








I'm very new to python and PyQT and have become stuck. So apologies if my code is a bit of a mess. I have spent quite some time searching but haven't yet found anything that helps my situation.



I'm trying to identify which ellipse was clicked.



I basically have a section that creates ellipses in a circle and prints text over it based on values from an array of lists:



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


This is my mouseReleaseEvent, where I am then trying to work out the name associated with that ellipse by using the same formula that I used to lay them out.



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)


This doesn't work as intended. I've tried .sceenPos() .screenPos() and .pos() but they don't appear to match up with the co-ordinates from when I created the ellipses, resulting in it identifying the wrong associated text or not finding a match at all.



Can anyone help me with a way to identify the ellipse or what why my code isn't working the way I want it to? There doesn't seem to be a way to 'name' them, which would be easier.










share|improve this question
















I'm very new to python and PyQT and have become stuck. So apologies if my code is a bit of a mess. I have spent quite some time searching but haven't yet found anything that helps my situation.



I'm trying to identify which ellipse was clicked.



I basically have a section that creates ellipses in a circle and prints text over it based on values from an array of lists:



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


This is my mouseReleaseEvent, where I am then trying to work out the name associated with that ellipse by using the same formula that I used to lay them out.



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)


This doesn't work as intended. I've tried .sceenPos() .screenPos() and .pos() but they don't appear to match up with the co-ordinates from when I created the ellipses, resulting in it identifying the wrong associated text or not finding a match at all.



Can anyone help me with a way to identify the ellipse or what why my code isn't working the way I want it to? There doesn't seem to be a way to 'name' them, which would be easier.







python pyqt pyqt5 qgraphicsview qgraphicsscene






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 20 '18 at 18:08









eyllanesc

78.7k103256




78.7k103256










asked Nov 19 '18 at 21:04









xnemesisxnemesis

474




474













  • whats is getLights?

    – eyllanesc
    Nov 19 '18 at 23:59











  • It’s a defined function that returns an array of dictionaries with details of Hive lights: [0] { “name” : “value”, “id” : “value”, “status” : Boolean, “brightness” : “value” }

    – xnemesis
    Nov 20 '18 at 17:14





















  • whats is getLights?

    – eyllanesc
    Nov 19 '18 at 23:59











  • It’s a defined function that returns an array of dictionaries with details of Hive lights: [0] { “name” : “value”, “id” : “value”, “status” : Boolean, “brightness” : “value” }

    – xnemesis
    Nov 20 '18 at 17:14



















whats is getLights?

– eyllanesc
Nov 19 '18 at 23:59





whats is getLights?

– eyllanesc
Nov 19 '18 at 23:59













It’s a defined function that returns an array of dictionaries with details of Hive lights: [0] { “name” : “value”, “id” : “value”, “status” : Boolean, “brightness” : “value” }

– xnemesis
Nov 20 '18 at 17:14







It’s a defined function that returns an array of dictionaries with details of Hive lights: [0] { “name” : “value”, “id” : “value”, “status” : Boolean, “brightness” : “value” }

– xnemesis
Nov 20 '18 at 17:14














1 Answer
1






active

oldest

votes


















1














Do not work 2 times unnecessarily, save a value reference and print it since mouseReleaseEvent() will only be called if the item is pressed:



import math
from PyQt5 import QtCore, QtGui, QtWidgets

def getLights():
return [{"name": str(i)} for i in range(10)]

class CallbackEllipse(QtWidgets.QGraphicsEllipseItem):
def __init__(self, light, *args, **kwargs):
super(CallbackEllipse, self).__init__(*args, **kwargs)
self._light = light

def mouseReleaseEvent(self, event):
color = QtGui.QColor(QtCore.Qt.lightGray)
brush = QtGui.QBrush(color)
self.setBrush(brush)
print(self._light["name"])
super(CallbackEllipse, self).mouseReleaseEvent(event)

class MyFrame(QtWidgets.QGraphicsView):
def __init__(self, parent=None):
super(MyFrame, self).__init__(parent)

self.setScene(QtWidgets.QGraphicsScene(self))
self.setBackgroundBrush(QtGui.QColor(QtCore.Qt.darkGray))
self.setRenderHints(self.renderHints() | QtGui.QPainter.Antialiasing | QtGui.QPainter.SmoothPixmapTransform)

arLights = getLights()

theta = math.radians(360)
filter_lights = list(filter(None, arLights))
num_of_columns = len(filter_lights)
delta = theta/num_of_columns
circX, circY = 0, 0
w, h, x, y = 100, 100, 100, 100

pen = QtGui.QPen(QtGui.QColor(QtCore.Qt.lightGray).darker(50))
brush = QtGui.QBrush(QtGui.QColor(QtCore.Qt.lightGray))

for i, light in enumerate(filter_lights):
angle = i*delta
circX = (w + x) * math.cos(angle)
circY = (h + y) * math.sin(angle)
item = CallbackEllipse(light, circX, circY, w, h)
item.setAcceptHoverEvents(True)
item.setPen(pen)
item.setBrush(brush)
item.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable)
self.scene().addItem(item)

if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MyFrame()
w.show()
sys.exit(app.exec_())





share|improve this answer


























  • Thank you so much eyllanesc. It works perfectly. Now to study this carefully and work out exactly what is happening why it works.

    – xnemesis
    Nov 20 '18 at 18:00











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53382602%2fdetermine-which-ellipse-in-click-event%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









1














Do not work 2 times unnecessarily, save a value reference and print it since mouseReleaseEvent() will only be called if the item is pressed:



import math
from PyQt5 import QtCore, QtGui, QtWidgets

def getLights():
return [{"name": str(i)} for i in range(10)]

class CallbackEllipse(QtWidgets.QGraphicsEllipseItem):
def __init__(self, light, *args, **kwargs):
super(CallbackEllipse, self).__init__(*args, **kwargs)
self._light = light

def mouseReleaseEvent(self, event):
color = QtGui.QColor(QtCore.Qt.lightGray)
brush = QtGui.QBrush(color)
self.setBrush(brush)
print(self._light["name"])
super(CallbackEllipse, self).mouseReleaseEvent(event)

class MyFrame(QtWidgets.QGraphicsView):
def __init__(self, parent=None):
super(MyFrame, self).__init__(parent)

self.setScene(QtWidgets.QGraphicsScene(self))
self.setBackgroundBrush(QtGui.QColor(QtCore.Qt.darkGray))
self.setRenderHints(self.renderHints() | QtGui.QPainter.Antialiasing | QtGui.QPainter.SmoothPixmapTransform)

arLights = getLights()

theta = math.radians(360)
filter_lights = list(filter(None, arLights))
num_of_columns = len(filter_lights)
delta = theta/num_of_columns
circX, circY = 0, 0
w, h, x, y = 100, 100, 100, 100

pen = QtGui.QPen(QtGui.QColor(QtCore.Qt.lightGray).darker(50))
brush = QtGui.QBrush(QtGui.QColor(QtCore.Qt.lightGray))

for i, light in enumerate(filter_lights):
angle = i*delta
circX = (w + x) * math.cos(angle)
circY = (h + y) * math.sin(angle)
item = CallbackEllipse(light, circX, circY, w, h)
item.setAcceptHoverEvents(True)
item.setPen(pen)
item.setBrush(brush)
item.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable)
self.scene().addItem(item)

if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MyFrame()
w.show()
sys.exit(app.exec_())





share|improve this answer


























  • Thank you so much eyllanesc. It works perfectly. Now to study this carefully and work out exactly what is happening why it works.

    – xnemesis
    Nov 20 '18 at 18:00
















1














Do not work 2 times unnecessarily, save a value reference and print it since mouseReleaseEvent() will only be called if the item is pressed:



import math
from PyQt5 import QtCore, QtGui, QtWidgets

def getLights():
return [{"name": str(i)} for i in range(10)]

class CallbackEllipse(QtWidgets.QGraphicsEllipseItem):
def __init__(self, light, *args, **kwargs):
super(CallbackEllipse, self).__init__(*args, **kwargs)
self._light = light

def mouseReleaseEvent(self, event):
color = QtGui.QColor(QtCore.Qt.lightGray)
brush = QtGui.QBrush(color)
self.setBrush(brush)
print(self._light["name"])
super(CallbackEllipse, self).mouseReleaseEvent(event)

class MyFrame(QtWidgets.QGraphicsView):
def __init__(self, parent=None):
super(MyFrame, self).__init__(parent)

self.setScene(QtWidgets.QGraphicsScene(self))
self.setBackgroundBrush(QtGui.QColor(QtCore.Qt.darkGray))
self.setRenderHints(self.renderHints() | QtGui.QPainter.Antialiasing | QtGui.QPainter.SmoothPixmapTransform)

arLights = getLights()

theta = math.radians(360)
filter_lights = list(filter(None, arLights))
num_of_columns = len(filter_lights)
delta = theta/num_of_columns
circX, circY = 0, 0
w, h, x, y = 100, 100, 100, 100

pen = QtGui.QPen(QtGui.QColor(QtCore.Qt.lightGray).darker(50))
brush = QtGui.QBrush(QtGui.QColor(QtCore.Qt.lightGray))

for i, light in enumerate(filter_lights):
angle = i*delta
circX = (w + x) * math.cos(angle)
circY = (h + y) * math.sin(angle)
item = CallbackEllipse(light, circX, circY, w, h)
item.setAcceptHoverEvents(True)
item.setPen(pen)
item.setBrush(brush)
item.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable)
self.scene().addItem(item)

if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MyFrame()
w.show()
sys.exit(app.exec_())





share|improve this answer


























  • Thank you so much eyllanesc. It works perfectly. Now to study this carefully and work out exactly what is happening why it works.

    – xnemesis
    Nov 20 '18 at 18:00














1












1








1







Do not work 2 times unnecessarily, save a value reference and print it since mouseReleaseEvent() will only be called if the item is pressed:



import math
from PyQt5 import QtCore, QtGui, QtWidgets

def getLights():
return [{"name": str(i)} for i in range(10)]

class CallbackEllipse(QtWidgets.QGraphicsEllipseItem):
def __init__(self, light, *args, **kwargs):
super(CallbackEllipse, self).__init__(*args, **kwargs)
self._light = light

def mouseReleaseEvent(self, event):
color = QtGui.QColor(QtCore.Qt.lightGray)
brush = QtGui.QBrush(color)
self.setBrush(brush)
print(self._light["name"])
super(CallbackEllipse, self).mouseReleaseEvent(event)

class MyFrame(QtWidgets.QGraphicsView):
def __init__(self, parent=None):
super(MyFrame, self).__init__(parent)

self.setScene(QtWidgets.QGraphicsScene(self))
self.setBackgroundBrush(QtGui.QColor(QtCore.Qt.darkGray))
self.setRenderHints(self.renderHints() | QtGui.QPainter.Antialiasing | QtGui.QPainter.SmoothPixmapTransform)

arLights = getLights()

theta = math.radians(360)
filter_lights = list(filter(None, arLights))
num_of_columns = len(filter_lights)
delta = theta/num_of_columns
circX, circY = 0, 0
w, h, x, y = 100, 100, 100, 100

pen = QtGui.QPen(QtGui.QColor(QtCore.Qt.lightGray).darker(50))
brush = QtGui.QBrush(QtGui.QColor(QtCore.Qt.lightGray))

for i, light in enumerate(filter_lights):
angle = i*delta
circX = (w + x) * math.cos(angle)
circY = (h + y) * math.sin(angle)
item = CallbackEllipse(light, circX, circY, w, h)
item.setAcceptHoverEvents(True)
item.setPen(pen)
item.setBrush(brush)
item.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable)
self.scene().addItem(item)

if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MyFrame()
w.show()
sys.exit(app.exec_())





share|improve this answer















Do not work 2 times unnecessarily, save a value reference and print it since mouseReleaseEvent() will only be called if the item is pressed:



import math
from PyQt5 import QtCore, QtGui, QtWidgets

def getLights():
return [{"name": str(i)} for i in range(10)]

class CallbackEllipse(QtWidgets.QGraphicsEllipseItem):
def __init__(self, light, *args, **kwargs):
super(CallbackEllipse, self).__init__(*args, **kwargs)
self._light = light

def mouseReleaseEvent(self, event):
color = QtGui.QColor(QtCore.Qt.lightGray)
brush = QtGui.QBrush(color)
self.setBrush(brush)
print(self._light["name"])
super(CallbackEllipse, self).mouseReleaseEvent(event)

class MyFrame(QtWidgets.QGraphicsView):
def __init__(self, parent=None):
super(MyFrame, self).__init__(parent)

self.setScene(QtWidgets.QGraphicsScene(self))
self.setBackgroundBrush(QtGui.QColor(QtCore.Qt.darkGray))
self.setRenderHints(self.renderHints() | QtGui.QPainter.Antialiasing | QtGui.QPainter.SmoothPixmapTransform)

arLights = getLights()

theta = math.radians(360)
filter_lights = list(filter(None, arLights))
num_of_columns = len(filter_lights)
delta = theta/num_of_columns
circX, circY = 0, 0
w, h, x, y = 100, 100, 100, 100

pen = QtGui.QPen(QtGui.QColor(QtCore.Qt.lightGray).darker(50))
brush = QtGui.QBrush(QtGui.QColor(QtCore.Qt.lightGray))

for i, light in enumerate(filter_lights):
angle = i*delta
circX = (w + x) * math.cos(angle)
circY = (h + y) * math.sin(angle)
item = CallbackEllipse(light, circX, circY, w, h)
item.setAcceptHoverEvents(True)
item.setPen(pen)
item.setBrush(brush)
item.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable)
self.scene().addItem(item)

if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MyFrame()
w.show()
sys.exit(app.exec_())






share|improve this answer














share|improve this answer



share|improve this answer








edited Nov 20 '18 at 0:30

























answered Nov 20 '18 at 0:12









eyllanesceyllanesc

78.7k103256




78.7k103256













  • Thank you so much eyllanesc. It works perfectly. Now to study this carefully and work out exactly what is happening why it works.

    – xnemesis
    Nov 20 '18 at 18:00



















  • Thank you so much eyllanesc. It works perfectly. Now to study this carefully and work out exactly what is happening why it works.

    – xnemesis
    Nov 20 '18 at 18:00

















Thank you so much eyllanesc. It works perfectly. Now to study this carefully and work out exactly what is happening why it works.

– xnemesis
Nov 20 '18 at 18:00





Thank you so much eyllanesc. It works perfectly. Now to study this carefully and work out exactly what is happening why it works.

– xnemesis
Nov 20 '18 at 18:00




















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53382602%2fdetermine-which-ellipse-in-click-event%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







這個網誌中的熱門文章

Tangent Lines Diagram Along Smooth Curve

Yusuf al-Mu'taman ibn Hud

Zucchini