Как запустить сигнал с помощью QMetaObject :: activ - PullRequest
2 голосов
/ 13 апреля 2019

Я нашел интересную статью о том, как реализовать QObject с динамическими свойствами (см. Класс C ++ 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 :: activ?

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

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

1 Ответ

1 голос
/ 14 апреля 2019

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

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

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

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

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

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

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