[PyQt] subtel problem with event handler when disconnect - reconnect the event from within the handler AND display QMsgbox ?

Doug Bell dougb at bellz.org
Wed Oct 12 14:09:48 BST 2011


Grégory Starck wrote:
> Hi dear list,
> 
> on windows7-64, with python32 (and also with python27) (-x86) and
> pyqt-4.8.5-1:
> 
> First of all: I'm quite new with Qt (pyqt).. and so I don't know all
> of it, even more specifically about the restrictions/exceptions/etc..,
> from far.
> 
> in a quite simple window (just a tableWidget and few buttons
> basically) :
> 
> I connected the itemChanged signal/event of the tableWidget to one of
> my method.  ( gui.tableWidget.itemChanged.connect(self.onCellChanged)
> )
> 
> but in this method I want to be able to eventually re-modify the value
> of the item (depending on some conditions)..
> 
> but doing so re-generate a itemChanged event..  so in that case my
> method was called 1 extra time that I don't want.
> 
> I used to work around that by : on begin of my method : I disconnect
> the event itemChanged from my method. And on exit of my method I
> re-connect the signal to it.
> 
> my question is : does it sound like all right to you ??
> 
> because with that I sometimes (but quite highly reproducible) get real
> crash from QtCore.. but without any valuable detail.   as far as I
> understood : it could be a problem because I disconnect-reconnect the
> event handler from within the handler itself AND ALSO, apparently,
> that I was also displaying a QtGui.QMessageBox  from within my method.
> (when I remove the display of the Qmsgbox then the crash doesn't occur
> anymore, never, as far I could see).
> 
> Now I've totally work around the problem/crash by using a bool flag
> that I initially set to False.  when my itemChanged event handler
> enters : it checks for the flag. if True -> the method directly
> returns. Else it sets the flag to True and the method executes
> normally. before returning from it I reset the flag to False.  So that
> if I change the value of the item in the method then the method will
> still be called 1 extra time but I notice it thx to the flag.

A cleaner way to do this is to use widget.blockSignals(True) before
re-modifying the value and then widget.blockSignals(False) afterward.

-Doug


More information about the PyQt mailing list