Проблема компиляции при попытке использовать qobject_cast для Const Pointer - PullRequest
0 голосов
/ 12 мая 2019

Я реализую плагины низкого уровня в Qt, но наткнулся на странную ошибку компиляции.

Когда я пытаюсь использовать qobject_cast для приведения экземпляра плагина к const указателю на интерфейсговорит мне, что сам интерфейс должен наследовать QObject и использовать макрос Q_OBJECT.

Однако, когда я использую qobject_cast для приведения к неконстантному указателю на интерфейс, он компилируется просто отлично.

У меня есть интерфейс:

class PluginInterface
{

public:
    PluginInterface(const QString &string);
    virtual void doSomething() const = 0;

protected:
    QString string;
};

Q_DECLARE_INTERFACE(PluginInterface, "PluginInterface")

И реализация:

class PLUGINSHARED_EXPORT Plugin : public QObject, public PluginInterface
{
    Q_OBJECT
    Q_INTERFACES(PluginInterface)
    Q_PLUGIN_METADATA(IID "Plugin")

public:
    Plugin();

    void doSomething() const;
};

При попытке компиляции с приведением qobject_cast к константному указателю он жалуется, что PluginInterface должен наследоваться от QObject ииспользуйте макрос Q_OBJECT.

    QPluginLoader loader("C:/Users/Henrique/Documents/Qt Projects/PluginTest/Plugin.dll");

    const PluginInterface *interface = qobject_cast<const PluginInterface *>(loader.instance());

    interface->doSomething();

Однако это компилируется просто отлично, то есть приведение к неконстантному указателю PluginInterface.

    QPluginLoader loader("C:/Users/Henrique/Documents/Qt Projects/PluginTest/Plugin.dll");

    const PluginInterface *interface = qobject_cast<PluginInterface *>(loader.instance());

    interface->doSomething();

Почему это так?

1 Ответ

1 голос
/ 12 мая 2019

Я думаю, это потому, что макрос Q_DECLARE_INTERFACE не реализует эту функцию.

Q_DECLARE_INTERFACE определение:

#  define Q_DECLARE_INTERFACE(IFace, IId) \
    template <> inline const char *qobject_interface_iid<IFace *>() \
    { return IId; } \
    template <> inline IFace *qobject_cast<IFace *>(QObject *object) \
    { return reinterpret_cast<IFace *>((object ? object->qt_metacast(IId) : nullptr)); } \
    template <> inline IFace *qobject_cast<IFace *>(const QObject *object) \
    { return reinterpret_cast<IFace *>((object ? const_cast<QObject *>(object)->qt_metacast(IId) : nullptr)); }
#endif // Q_MOC_RUN

Как мы видим, этот макрос содержит только эти qobject_cast функции: template <> inline IFace *qobject_cast<IFace *>(QObject *object) и template <> inline IFace *qobject_cast<IFace *>(const QObject *object).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...