Determine which ellipse in click event











up vote
1
down vote

favorite












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 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 at 17:14

















up vote
1
down vote

favorite












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 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 at 17:14















up vote
1
down vote

favorite









up vote
1
down vote

favorite











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 at 18:08









eyllanesc

69.8k93052




69.8k93052










asked Nov 19 at 21:04









xnemesis

404




404












  • whats is getLights?
    – eyllanesc
    Nov 19 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 at 17:14




















  • whats is getLights?
    – eyllanesc
    Nov 19 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 at 17:14


















whats is getLights?
– eyllanesc
Nov 19 at 23:59




whats is getLights?
– eyllanesc
Nov 19 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 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 at 17:14














1 Answer
1






active

oldest

votes

















up vote
1
down vote



accepted










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 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',
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








up vote
1
down vote



accepted










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 at 18:00















up vote
1
down vote



accepted










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 at 18:00













up vote
1
down vote



accepted







up vote
1
down vote



accepted






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 at 0:30

























answered Nov 20 at 0:12









eyllanesc

69.8k93052




69.8k93052












  • 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 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 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 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 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.





Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


Please pay close attention to the following guidance:


  • 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







Popular posts from this blog

Wiesbaden

Marschland

Dieringhausen