[Interest] Problem about signals/slots in Qt 5

Stephen Chu stephen at ju-ju.com
Tue Sep 18 18:56:40 CEST 2012


On 9/18/12 11:00 AM, Konrad Rosenbaum wrote:
> 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.

I realized that right after I sent the mail. :)

> 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.

Thanks for the fix. That's a much better way.





More information about the Interest mailing list