我正在開發一個基本的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