[Interest] Problem about signals/slots in Qt 5

Konrad Rosenbaum konrad at silmor.de
Tue Sep 18 17:00:44 CEST 2012


On Tuesday 18 September 2012 14:21:58 Stephen Chu wrote:
> On 9/18/12 4:10 AM, Thiago Macieira wrote:
> >> How could I solve this?
> >> 
> >> In Qt 4 I could specialize the signal using SIGNAL(valueChanged(int)),
> >> how could I do in Qt 5?
> >> 
> >      void (QSpinBox:: *signal)(int) = &QSpinBox::valueChanged;
> >      QObject::connect(spinBox, signal, slider, &QSlider::setValue);
> 
> or:
> 
> QObject::connect(spinBox, (void (QSpinBox:: *)(int))
> &QSpinBox::valueChanged, slider, &QSlider::setValue);
> 
> if you want to keep it in one line.
> 
> I like this new syntax much better since it finds signal/slot mismatches
> at compile time. I used to miss the connection mismatch messages in the
> sea of my REALLY chatty logs. And pulling my hairs wondering why
> something doesn't work. :)

Actually using C-style casts you still run the risk of creating garbage if you 
change the parameter types. Above: if QSpinBox had a signal 
valueChanged(float) and no other override for that method name it would go 
undetected and may lead to interesting situations during runtime.

Safer:

QObject::connect(spinBox, static_cast<void (QSpinBox:: *)(int)> 
(&QSpinBox::valueChanged), slider, &QSlider::setValue);

This way whenever you change the parameter type(s) the compiler will detect 
it. 

I'm not sure how to detect a misalignment between instance type and the class 
name in the cast. E.g. if spinBox was not a QSpinBox, but a QLineEdit.


	Konrad
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20120918/afc3bc4d/attachment.sig>


More information about the Interest mailing list