Determine which ellipse in click event
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
add a comment |
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
whats isgetLights
?
– 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
add a comment |
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
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
python pyqt pyqt5 qgraphicsview qgraphicsscene
edited Nov 20 '18 at 18:08
eyllanesc
77.7k103156
77.7k103156
asked Nov 19 '18 at 21:04
xnemesisxnemesis
474
474
whats isgetLights
?
– 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
add a comment |
whats isgetLights
?
– 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
add a comment |
1 Answer
1
active
oldest
votes
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_())
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
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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_())
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
add a comment |
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_())
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
add a comment |
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_())
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_())
edited Nov 20 '18 at 0:30
answered Nov 20 '18 at 0:12
eyllanesceyllanesc
77.7k103156
77.7k103156
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
add a comment |
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
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
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