[Interest] qobject_cast

Igor Mironchik igor.mironchik at gmail.com
Thu Apr 20 08:10:04 CEST 2017



20.04.2017 9:01, Ch'Gans пишет:
> On 20 April 2017 at 17:56, Igor Mironchik <igor.mironchik at gmail.com> wrote:
>>
>> 20.04.2017 8:47, Ch'Gans пишет:
>>
>>> On 20 April 2017 at 17:03, Igor Mironchik <igor.mironchik at gmail.com>
>>> wrote:
>>>> Hi,
>>>>
>>>>
>>>> 20.04.2017 7:52, Ch'Gans пишет:
>>>>> On 20 April 2017 at 16:38, Igor Mironchik <igor.mironchik at gmail.com>
>>>>> wrote:
>>>>>> Hi,
>>>>>>
>>>>>> What the benefits of qobject_cast<> on simple static_cast<>? Or there
>>>>>> is
>>>>>> no
>>>>> qobject_cast
>>>>> - works only on QObject (obviously)
>>>>> - returns nullptr if the object cannot be casted to the required type
>>>>
>>>> And it can fail if QObject derived pointer was returned from plugin.
>>> Is this a statement or a question?
>>>
>>> if I'm not wrong, qobject_cast relies on QMetaObject
>>> (object->metaObject() and Class::staticMetaObject()).
>>>
>>> Actually, i've just checked the sources and qobject_cast<T*>(object)
>>> returns "static_cast<T*>(T::staticMetaObject().cast(object))" and
>>> QMetaObject::cast(obj) returns "(obj &&
>>> obj->metaObject()->inherits(this)) ? obj : nullptr"
>>>
>>> QMetaObject allows you to walk the class inheritance hierarchy, and
>>> inherits() does exactly this.
>>> I don't think that the fact that the object comes from a plugin can
>>> make inherits() fail.
>>> If you are able to load the plugin successfully, it means that you
>>> have no unresolved symbols.
>>
>> Exactly! qobject_cast<> will fail.
>>
>> Look in application you have:
>>
>> class Channel
>>    :  public QObject
>> {};
>>
>> In plugin you have:
>>
>> class MyChannel
>>    :  public Channel
>> {};
>>
>> Channel * create();
>>
>> In application you call:
>>
>> Channel * ch = create();
>>
>> And use this object in your application.
>>
>> Then in one slot in application you can have:
>>
>> void mySlot()
>> {
>>    Channel * ch = qobject_cast< Channel* > ( sender() );
>>    // You are 100% sure that sender() is Channel!!!
>>    // And this cast will fail!!!
> Try to call dumpObjectInfo(sender());

OBJECT Globe::ComoChannel::Channel

SIGNALS OUT

signal: destroyed(QObject*)

signal: destroyed()

signal: objectNameChanged(QString)

signal: sourceUpdated(Como::Source)

<functor or function pointer>

signal: sourceDeregistered(Como::Source)

<functor or function pointer>

signal: connected()

<functor or function pointer>

<functor or function pointer>

signal: disconnected()

<functor or function pointer>

<functor or function pointer>

<functor or function pointer>

signal: messagesRate(int)

<functor or function pointer>

signal: aboutToConnectToHost(QHostAddress,ushort)

<functor or function pointer>

signal: aboutToDisconnectFromHost()

<functor or function pointer>

signal: aboutToSendGetListOfSources()

<functor or function pointer>

SIGNALS IN

<-- QTimer::unnamed <unknown>

<-- QTimer::unnamed <unknown>

<-- Como::ClientSocket::unnamed <unknown>

<-- Como::ClientSocket::unnamed <unknown>

<-- Como::ClientSocket::unnamed <unknown>

<-- Como::ClientSocket::unnamed <unknown>

<-- Como::ClientSocket::unnamed <unknown>




>
> Chris
>
>> }
>>
>>> AFAIK, the only problems with plugins is meta-type registration that
>>> has to be done explicitly by calling qRegisterMataType(...);
>>> I don't think that QMetaObject suffers from this. Maybe someone can
>>> confirm this.
>>>
>>>>> - doesn't relies on RTTI, and is way faster than dynamic cast
>>>>
>>>> This is understandable. But with comparison with static cast there are no
>>>> benefits?
>>> My point was: dynamic_cast is safer than static_cast, and qobject_cast
>>> is faster than dynamic_cast.
>>>
>>> So qobject_cast is a "double win" over static_cast and dynamic_cast.
>>>
>>> Chris
>>>
>>>>> Chris
>>>>>
>>>>>> one?
>>>>>>
>>>>>> _______________________________________________
>>>>>> Interest mailing list
>>>>>> Interest at qt-project.org
>>>>>> http://lists.qt-project.org/mailman/listinfo/interest
>>>>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20170420/55c541b5/attachment.html>


More information about the Interest mailing list