Как запустить сигнал с помощью QMetaObject ::activate

#qt

#qt

Вопрос:

Я нашел интересную статью о том, как дополнить QObject динамическими свойствами (см. C class DynamicObject ). Код из статьи работает нормально, свойства DynamicObject успешно получены и установлены как из C , так и из QML, но единственное, что я не могу понять, это как запускать динамические сигналы.

Я попытался запустить сигнал «NameChanged ()» с помощью следующего кода:

 bool DynamicObject::emitDynamicSignal(char *signal, void **arguments)
{
    QByteArray theSignal = QMetaObject::normalizedSignature(signal);
    int signalId = metaObject()->indexOfSignal(theSignal);

    if (signalId >= 0)
    {
        QMetaObject::activate(this, metaObject(), signalId, arguments);
        return true;
    }

    return false;
}

myDynamicObject->emitDynamicSignal("nameChanged()", nullptr);
 

индекс сигнала найден, и signalId присваивается 5, но сигнал не запускается. Но если я это сделаю, например,

 myDynamicObject->setProperty("name", "Botanik");
 

свойство будет изменено, и сигнал будет успешно подан.

Что не так в моем коде? Что я должен передать в качестве параметра ‘arguments’ QMetaObject::activate ?

РЕДАКТИРОВАНИЕ 1:

Полный исходный код временно доступен здесь.

Ответ №1:

Сигнал — это тоже метод. Вы можете вызвать его из мета-объекта.

Итак, замените вашу строку QMetaObject::activate(...) на:

metaObject()->method(signalId).invoke(this);

И пусть Qt обрабатывает вызов activate() .

Существует также проблема в DynamicObject::qt_metacall() : вы обрабатываете только QMetaObject::ReadProperty QMetaObject::WriteProperty вызовы и .

Вы должны добавить QMetaObject::InvokeMetaMethod , если хотите передать свой сигнал.

Комментарии:

1. Пробовал это, но безуспешно, сигнал не запускается, см. Полный исходный код slogpost.ru/temp/DynamicObject.zip . Здесь нет файлов PDB для MSVC2017 download.qt.io/archive/qt/5.12/5.12.2 поэтому я не могу отлаживать invoke(this).

2. Я обновил свой ответ: проверьте свой DynamicObject::qt_metacall() . Есть пропущенные случаи.