[PyQt] adding signalling to QGraphicsItems
Christopher M. Nahler
christopher.nahler at papermodels.at
Thu Jul 1 15:10:32 BST 2010
On 01.07.2010 12:29, Phil Thompson wrote:
> On Thu, 01 Jul 2010 11:58:01 +0200, "Christopher M. Nahler"
> <christopher.nahler at papermodels.at> wrote:
>
>> I want to add signalling functionality to scene items. In my case they
>> are usually QGraphicsRectItems..
>>
>> I thought I could do this with deriving from QGraphicsObject but then I
>> loose all the funtionality for the rectangle, handling pens and brushes,
>> shapes etc.
>>
>> Isn't it easier to just derive from QGraphicsRectItem and QObject? Or
>> should I derive from QGraphicsRectItem and QGraphicsObject instead?
>>
> Neither. You can't multiply inherit from more than one PyQt class.
>
>
>> Or are there any other ways to do this?
>>
> Create a QObject subclass that implements your signals as an attribute of
> your QGraphicsRectItem.
>
> Phil
>
Thanks for the quick reply. I have tried to implement it that way but
stumbled over another problem I have in this case. I want to announce
that a MyRectangle was created (or has changed). When I want to add a
signalling object to my rectangle class I have to def it before. But
when I define the signal there I have to specify the data type which is
not yet defined.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class Communicator(QObject):
MyRectangleCreated = pyqtSignal(MyRectangle) <-- MyRectangle not
defined yet!
def __init(self):
super(Communicator, self).__init__(parent)
class MyRectangle(QGraphicsRectItem):
def __init__(self, rect=QRectF(0, 0, 0, 0), parent=None, scene=None):
super(MyRectangle, self).__init__(parent, scene)
self.myCommunicator = Communicator()
self.myCommunicator.MyRectangleCreated.emit(self)
if __name__ == "__main__":
r = MyRectangle()
In genereal what I want to do is synchronize the QGraphicsItems from the
scene with a list of data objects. So when I create a graphics item a
data object in the data manager should be created and when I change a
graphics object the corresponding data block object should be updated.
BTW right now I have the handling of the events (which creates and
changes graphics items) in a widget derived from a view.
Any hints on the best approach for that?
Thanks
Chris
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.riverbankcomputing.com/pipermail/pyqt/attachments/20100701/264f45e7/attachment.html>
More information about the PyQt
mailing list