[PyQt] How to select and test if a QGraphicsItem (or a QGraphicsPixmapItem) has been selected
sw33tz
nyavuz.nm20 at gmail.com
Sun May 1 14:49:06 BST 2016
Hello there, I sent you two emails, I dont know if you saw but I would very
much appreciate it if you took a look them :)
On Tue, Apr 26, 2016 at 5:33 PM, Nesibe Yavuz <nyavuz.nm20 at gmail.com> wrote:
> This is the full code:
>
> #!/usr/bin/python
>
> *import *threading
> *import *sys
> *from *PyQt4 *import *QtGui, QtCore, uic
>
> *global *host_list, host_cs, switch_cs, connectLine_cs
>
> host_list = []
> switch_list = []
> hostItem_list = []
> switchItem_list = []
> lineItem_list = []
>
> host_cs = 0
> switch_cs = 0
> connectLine_cs = 0
>
> *class **host_Object*(QtGui.QGraphicsPixmapItem, QtGui.QWidget):
> *def *__init__(self, parent=None):
> super(host_Object, self).__init__(parent)
> pixmap = QtGui.QPixmap("host.png")
> self.host_pixItem = QtGui.QGraphicsPixmapItem(pixmap.scaled(30, 30,
> QtCore.Qt.KeepAspectRatio))
> self
> .host_pixItem.setFlag(QtGui.QGraphicsPixmapItem.ItemIsSelectable)
> self.host_pixItem.setFlag(QtGui.QGraphicsPixmapItem.ItemIsMovable)
>
> *def **mousePressEvent*(self, event):
> *if *self.host_pixItem.isSelected():
> *print *'selected object'
>
>
> *class **graphicsScene*(QtGui.QGraphicsScene, QtGui.QWidget):
> *def *__init__(self, parent=None):
> super(graphicsScene, self).__init__(parent)
> self.i = 0
> self.j = 0
> self.setSceneRect(-180, -90, 360, 180)
> self.pen = QtGui.QPen(QtCore.Qt.black, 3, QtCore.Qt.SolidLine)
> self.under_mouse = 0
>
>
> *def **mousePressEvent*(self, event):
> *global *host_cs
>
> *if *host_cs == 1:
> self.host_item = host_Object()
> *for *host *in *hostItem_list:
> *if *host.isUnderMouse():
> *print *'selected'
>
> *elif *connectLine_cs == 1:
> self.cursorStartPosition = event.scenePos()
> self.start = QtCore.QPoint(self.cursorStartPosition.x(),self
> .cursorStartPosition.y())
>
> *def **mouseMoveEvent*(self, event):
> *if *self.start:
> self.cursorCurrentPosition = event.scenePos()
> current = QtCore.QPointF(self.cursorCurrentPosition.x(),self
> .cursorCurrentPosition.y())
> self.draw_line(current)
>
> *def **draw_line*(self, pos):
> *try*:
>
> # remove the old line if exists
> self.removeItem(self.line)
> *except*:
>
>
> *pass *self.line = QtGui.QGraphicsLineItem(QtCore.QLineF(self
> .start, pos))
> self.line.setPen(self.pen)
> self.addItem(self.line)
>
>
> *def **mouseReleaseEvent*(self, event):
> *global *host_cs
> *if *host_cs == 1:
> self.addItem(self.host_item.host_pixItem)
> self.host_item.host_pixItem.setPos(event.scenePos())
> hostItem_list.append(self.host_item.host_pixItem)
> self.i += 1
> host_list.append('h' + str(self.i))
>
>
> *elif *switch_cs == 1:
> pixmap = QtGui.QPixmap("switch.png")
> switch_pixItem = QtGui.QGraphicsPixmapItem(pixmap.scaled(30,
> 30, QtCore.Qt.KeepAspectRatio))
> self.addItem(switch_pixItem)
> switch_pixItem.setPos(event.scenePos())
> switchItem_list.append(switch_pixItem)
>
> self.j += 1
> switch_list.append('s' + str(self.j))
> self.update()
> *elif *connectLine_cs == 1:
>
> lineItem_list.append(self.line)
> *for *link *in *lineItem_list:
> self.addItem(link)
>
>
>
> *class **mininetGUI*(QtGui.QMainWindow, QtGui.QWidget):
> *def *__init__(self):
> super(mininetGUI, self).__init__()
> self.ui = uic.loadUi('minipynet.ui')
>
> self.ui.actionHost.triggered.connect(self.place_host)
> self.ui.actionSwitch.triggered.connect(self.place_switch)
> self.ui.actionConnectLine.triggered.connect(self.connect_line)
>
> self.scene = graphicsScene()
> self.ui.view.setScene(self.scene)
>
> *def **place_host*(self):
> *global *host_cs
> *global *switch_cs
> *global *connectLine_cs
> host_cs = 1
> switch_cs = 0
> connectLine_cs = 0
>
> *def **place_switch*(self):
> *global *host_cs
> *global *switch_cs
> *global *connectLine_cs
> switch_cs = 1
> host_cs = 0
> connectLine_cs = 0
>
> *def **connect_line*(self):
> *global *host_cs
> *global *switch_cs
> *global *connectLine_cs
> switch_cs = 0
> host_cs = 0
> connectLine_cs = 1
> #self.setMouseTracking(True)
>
>
>
> *if *__name__ == '__main__':
>
> app = QtGui.QApplication(sys.argv) # A new instance of QApplication
> form = mininetGUI() # We set the form to be our mininetGUI
> form.ui.show() # Show the form
> app.exec_()
>
> On Tue, Apr 26, 2016 at 5:29 PM, Nesibe Yavuz <nyavuz.nm20 at gmail.com>
> wrote:
>
>> I want to implement your second suggestion :
>>
>> "2) If you want your host/switch/line tools et.c to also double as
>> selection tools (e.g. click outside an item will create a new item,
>> while click on an item will select it), then you need to check if
>> there's an item under the cursor when the click happens, and if there
>> is, select it, otherwise go on with your current logic. "
>>
>> And to do that I wrote this code:
>>
>> *if *host_cs == 1:
>> self.host_item = host_Object()
>> *for *host *in *hostItem_list:
>> *if *host.isUnderMouse():
>> *print *'under mouse'
>>
>> The problem here is that I can only select the first item I ever create
>> and I have to keep on pressing the item (maybe about 4-5 times) until it
>> can actually be selected. I tried using the isSelected() method to check if
>> the item was selected and I still get the same result. I also tried to test
>> for a collision when adding the items so the items aren't drawn over each
>> other (for when trying to select an item the host_item keeps on being added
>> to the scene):
>>
>> *if *host_cs == 1:
>> self.host_item = host_Object()
>> *for *host *in *hostItem_list:
>> *if *self.host_item.host_pixItem.collidesWithItem(host):
>>
>> *print *'collision'
>>
>> Here the "*if *self.host_item.host_pixItem.collidesWithItem(host):"
>> statement keeps giving "False" as the output even though when I try to add
>> an item over another item the statement clearly should return "True".
>>
>>
>> By the way I'm sorry for the late replies I try to take your suggestions
>> in consideration and I try to implement them before replying back to you.
>>
>>
>>
>>
>> On Mon, Apr 25, 2016 at 9:07 PM, Elvis Stansvik [via Python] <
>> ml-node+s6n5189328h79 at n6.nabble.com> wrote:
>>
>>> 2016-04-25 19:27 GMT+02:00 sw33tz <[hidden email]
>>> <http:///user/SendEmail.jtp?type=node&node=5189328&i=0>>:
>>> > thank you for the reply. I am able to select the item when there is
>>> only one
>>> > item but I want the user to be able to add more than one item and also
>>> > select any item that they added. With my code I can't do that because
>>> with
>>> > every press event it just keeps adding items. Is there a way I can
>>> make this
>>> > happen?
>>>
>>> For the first question, I think the default behavior is that you can
>>> select multiple items by holding down Ctrl. If you want rubber band
>>> selection, you can do it quite easily by setting the drag mode of the
>>> QGraphicsView. If you want some more customized selection behavior, I
>>> think you'll have to manually handle the mouse/keyboard events and
>>> call setSelected on the items you want to select.
>>>
>>> For the second question: It again depends on what behavior you want:
>>>
>>> 1) If you want to have a "select tool" which the user must choose
>>> before he/she can select, then I guess you would implement it
>>> similarly to how you've implemented the host/switch/line tools that
>>> you've shown. You would have an elif for your select tool, where you
>>> let QGraphicsScene (the base class) handle the event, this will
>>> forward the event to the item (instead of it being swallowed by the
>>> scene event handler like you did, and the item will select itself.
>>>
>>> 2) If you want your host/switch/line tools et.c to also double as
>>> selection tools (e.g. click outside an item will create a new item,
>>> while click on an item will select it), then you need to check if
>>> there's an item under the cursor when the click happens, and if there
>>> is, select it, otherwise go on with your current logic.
>>>
>>> This is all from memory, so better check the docs. But I hope it gets
>>> you started.
>>>
>>> Googling also gives a lot of hits about selection handling with
>>> QGraphicsScene/QGraphicsView.
>>>
>>> Elvis
>>>
>>> >
>>> >
>>> >
>>> > --
>>> > View this message in context:
>>> http://python.6.x6.nabble.com/How-to-select-and-test-if-a-QGraphicsItem-or-a-QGraphicsPixmapItem-has-been-selected-tp5189232p5189325.html
>>> > Sent from the PyQt mailing list archive at Nabble.com.
>>> > _______________________________________________
>>> > PyQt mailing list [hidden email]
>>> <http:///user/SendEmail.jtp?type=node&node=5189328&i=1>
>>> > https://www.riverbankcomputing.com/mailman/listinfo/pyqt
>>> _______________________________________________
>>> PyQt mailing list [hidden email]
>>> <http:///user/SendEmail.jtp?type=node&node=5189328&i=2>
>>> https://www.riverbankcomputing.com/mailman/listinfo/pyqt
>>>
>>> ------------------------------
>>> If you reply to this email, your message will be added to the discussion
>>> below:
>>>
>>> http://python.6.x6.nabble.com/How-to-select-and-test-if-a-QGraphicsItem-or-a-QGraphicsPixmapItem-has-been-selected-tp5189232p5189328.html
>>> To unsubscribe from How to select and test if a QGraphicsItem (or a
>>> QGraphicsPixmapItem) has been selected, click here
>>> <http://python.6.x6.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=5189232&code=bnlhdnV6Lm5tMjBAZ21haWwuY29tfDUxODkyMzJ8LTE2MTY4NDE4NTE=>
>>> .
>>> NAML
>>> <http://python.6.x6.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml>
>>>
>>
>>
>
--
View this message in context: http://python.6.x6.nabble.com/How-to-select-and-test-if-a-QGraphicsItem-or-a-QGraphicsPixmapItem-has-been-selected-tp5189232p5189804.html
Sent from the PyQt mailing list archive at Nabble.com.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.riverbankcomputing.com/pipermail/pyqt/attachments/20160501/6e2c38c1/attachment-0001.html>
More information about the PyQt
mailing list