#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()
. Есть пропущенные случаи.