我正在开发一个基本的qml-cpp应用程序,以了解如何与另一个进行交互。我有一个MessageSetter C++类和一个main.qml。由于我希望了解双向通信,因此我使用setContextProperty将MessageSetter属性暴露给qml,并且还使用qml注册了MessageSetter类(可实例化注册)。暴露的属性工作正常。现在,当点击qml按钮时,信号(qmlBtnClicked)被成功捕获到MessageSetter槽(onQmlButtonClicked)中。此槽还会发出另一个MessageSetter信号(colorChanged)。这个新的(C++)信号应该被注册到qml注册的MessageSetter的信号处理程序(onColorChanged)中,但它在任何情况下都不会到达。下面是main.cpp中的代码:如何在类型注册后在QML信号处理程序中捕捉C++信号?
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++插槽中,但是我无法在qml信号处理程序中捕获到这个C++信号。请任何帮助。
正如我所看到的,这个问题集中在qmlRegisterType()上,不应该是this question的重复?我也想知道是否qmlRegisterType()和setContextProperty()不能同时使用?
这是我通过这种方式完成的链接。请让我知道如果我没有把它弄清楚(暴露信号部分)。 http://doc.qt.io/qt-5/qtqml-cppintegration-exposecppattributes.html – Jatin
你说得对。这个问题没有解决[这里](http://stackoverflow.com/questions/8834147/c-signal-to-qml-slot-in-qt)。我刚刚用一个例子回答。 – Tarod