Я разрабатываю базовое приложение qml-cpp, чтобы понять, как одно взаимодействует с другим. У меня есть класс MessageSetter C++ и один файл main.qml. Поскольку я хочу понять двустороннюю связь, я представил свойства MessageSetter для qml, используя setContextProperty, а также зарегистрировал класс MessageSetter с qml (мгновенная регистрация). Открытые свойства работают нормально. Теперь при нажатии кнопки qml сигнал (qmlBtnClicked) успешно перехватывается в слоте MessageSetter (onQmlButtonClicked). Этот слот далее испускает другой сигнал MessageSetter (colorChanged). Этот новый (C++) сигнал должен быть перехвачен в зарегистрированном в qml обработчике сигналов MessageSetter (onColorChanged), но в любом случае он не поступает сюда. Ниже приведен код main.cpp:
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
qmlRegisterType<MessageSetter>("com.SkillLotto.MessageSetter", 1, 0, "SetMessage");
MessageSetter data;
engine.rootContext()->setContextProperty("msgSetter", &data);
QQmlComponent component(&engine, QUrl::fromLocalFile("main.qml"));
QObject *object = component.create()->findChild<QObject*>("setTextBtn");
QObject::connect(object, SIGNAL(qmlBtnClicked()), &data, SLOT(onQmlButtonClicked()));
return app.exec();
}
Это слот MessageSetter, который испускает другой сигнал:
void MessageSetter::onQmlButtonClicked()
{
emit colorChanged("red");
}
Это код qml, этот обработчик сигналов никогда не вызывается:
SetMessage{
onColorChanged: {
rect.color = color //rect is some rectangle in this file.
}
}
Как я уже сказал, сигнал qml успешно перехватывается в слоте C++, но я не могу перехватить этот сигнал C++ в обработчике сигналов qml. Любая помощь, пожалуйста.
Этот вопрос, как я вижу, сосредоточен на qmlRegisterType() и не должен дублировать этот вопрос? Я также хочу знать, нельзя ли одновременно использовать qmlRegisterType() и setContextProperty()?