[PyQt] Old vs New Signals

Phil Thompson phil at riverbankcomputing.com
Mon Jul 9 13:03:07 BST 2012


On Mon, 09 Jul 2012 21:54:52 +1000, John Floyd <jfloyd at bigpond.net.au>
wrote:
> On Mon, 9 Jul 2012 11:18:40 you wrote:
>> On Sun, 08 Jul 2012 17:43:55 +1000, John Floyd <jfloyd at bigpond.net.au>
>> 
>> wrote:
>> > Note Corrected Subject (was New vs New ...  sorry)
>> > 
>> > I have 2 cases where I am having difficulties in PyQwt signals. 
Since
>> 
>> my
>> 
>> > original post I have investiagted the PyQwt code a bit closer and the
>> > following comes from that.  The previous discussions helped me in
>> 
>> looking
>> 
>> > further into the problem.
>> > 
>> > 1) a c++ typedef variable appears to cause problems
>> > 
>> > 	The old style signal works
>> > 	self.picker.connect(picker,SIGNAL('selected(const QwtPolygon &)')
>> > 
>> > 			,self.slot)
>> > 
>> >    however the new style signal does not work.
>> > 
>> > 	self.picker.selected[QwtPolygon].connect(self.slot)
>> > 
>> > Reported error
>> > 
>> > 	NameError: global name 'QwtPolygon' is not defined
>> > 
>> > Yet the MetaObject lists the following as a signal signature
>> > 
>> > 	selected(QwtPolygon).
>> > 
>> > The reasoning appears to be that in the c++ code QwtPolygon is
>> 
>> typedef'ed
>> 
>> > from
>> > QPolygon. Shouldnt this be handled?
>> > 
>> > 2) Problems with template argument the signal definition. For example
>> > 
>> > 	self.picker.connect(self.picker,
>> > 
>> > 		SIGNAL('selected(const QwtArray<QwtDoublePoint>&)'), self.slot)
>> > 
>> > returns an error
>> > 
>> > 	TypeError: C++ type 'QwtArray<QwtDoublePoint>' is not supported as a
>> 
>> slot
>> 
>> > argument type
>> > 
>> > The signature is listed in the GmetaObject.
>> > 
>> > In the sip code QwtArray<QwtDoublePoint> is MappedTyped as
>> > QwtArrayQwtDoublePoint - using this as the signature as below returns
>> 
>> yet
>> 
>> > another error
>> > 
>> > 	self.picker.connect(self.picker,
>> > 
>> > 		SIGNAL('selected(const QwtArrayQwtDoublePoint&)'), self.slot)
>> > 
>> > and also as a new signal
>> > 
>> > 	self.picker.selected[QwtArrayQwtDoublePoint].connect(self.slot)
>> > 
>> > TypeError: connect() failed between selected(QwtArrayQwtDoublePoint)
>> > and
>> > 
>> > unislot()
>> > 
>> > Phil Thompson has said that in this case the python code should
accept
>> 
>> the
>> 
>> > c++
>> > signature but it does not.
>> > 
>> > Intriquingly the definition of QwtArray is also a c++ typedef in the
>> > Qwt
>> > code.
>> > 
>> > The trouble is that for this particlar picker class, the selected
>> > signal
>> > is
>> > overloaded multiple times so the signatures are necessary.
>> 
>> As far as I can see the only class with a signal selected(QwtPolygon)
is
>> QwtPicker and that doesn't overload the signal. The only class that
does
>> is
>> QwtPlotPicker, but you don't say which you are using.
>> 
>> Maybe the problem is your picker is a QwtPlotPicker but you are trying
to
>> use QwtPicker.selected? In which case try...
>> 
>>     super(QwtPlotPicker, self.picker).connect(self.slot)
>> 
>> Phil
> 
> There are problems trying to connect both the QwtPicker _and_
> QwtPlotPicker 
> selected signals.  I have tried to outline what I have encountered in
the 
> previous email.
> 
> Yes I am using QwtPlotPicker, and what I mean with "the MetaObject lists
> the 
> following as a signal signature" is I have a small function that returns
> the 
> signatures from the MetaObject of the instance I am using.  And it lists

> selected(QwtPolygon) as being there.  But I cannot find a way to use it
in
> a 
> new signal style - yet it works in the old signal style?!  
> 
> Yes you are correct in this case for the QwtPolygon signal described 
> previously in 1), in that it is the signal inherited from the QwtPicker
> base 
> class that I am catching. It returns the polygon in pixel coords.  
> 
> The overloading problem comes in when I try the signal described above
in
> 2) 
> with the QwtArrayQwtDoublePoint signature (which returns the same
polygon
> in 
> data coords).  This is the overloaded signal I want to use.  In this
case 
> neither old nor new style signals work, with the errors reported in the 
> previous email.  Again the MetaObject has the template version of the
> signal 
> in its list.
> 
> I must thank you, Phil for taking some effort in checking out the Qwt
code
> to 
> understand my problems.
> 
> regards
> John

You need to provide a small and complete test case that demonstrates the
problem.

Phil


More information about the PyQt mailing list