My Projects包含6QMLFiles: main.qml打开一个新的ApplicationWindow并声明工具栏。它还使用initalItem homescreen.qml初始化StackView。在主屏幕上,我有不同的按钮,通过stack.push(网址)打开不同的qml文件。除了main.qml之外,所有文件都以项目{}开头。我已经能够连接来自main.qml和home.qml的信号。但我一直无法访问堆栈中更深的对象。我不知道我是否必须更改我的.cpp代码来访问其他对象,或者我是否应该更改StackView的初始化,以便所有文件在开始时都被加载和访问。以下是代码,分解到最基本的部分:
ApplicationWindow { Rectangle{ id: homeButton objectName:"homeButton“signal qmlSignal(string msg) MouseArea { onClicked:{stack.push({item:"qrc:/home.qml});homeButton.qmlSignal("Hello")} StackView{ initalItem:"qrc:/home.qml“}
}
项目{ Rectangle{ id:测试objectName:“测试”信号qmlSignal(string msg) MouseArea { onClicked:{stack.push({ Item :"qrc:/thirdframe.qml});test.qmlSignal("Hello") }
QUrl(QStringLiteral("qrl:/secondframe.qml")));QApplication (argc,argv);QQmlEngine enigne;QQmlComponent组件(&engine,QUrl(QStringLiteral(“qrl:/main.qml”);QObject *object = componet.create();新组件(&engine,QApplication QObject *newobject = newcomponet.create();MyClass myClass QObject * QQmlComponent = object->findChild("homeButton");//我可以连接到main.qml或home.qml QObject中的每个对象::connect (home,SIGNAL(qmlSignal(Qstring)),&myClass,SLOT(cppSlot(Qstring);QObject *test = newobject->findChild("test");//无法连接到secondframe.qml QObject:: connect (test,SIGNAL(qmlSignal(Qstring),&myClass,qmlSignal(Qstring))中的对象
发布于 2017-01-25 18:18:39
比进入QML树并提取可能存在或不存在的对象更好的方法是向QML提供基于C++的API。
Q_INVOKABLE
调用所需的方法。类MyAPI :公共QObject { Q_OBJECT公共插槽:空cppSlot(const QString &text);};
MyAPI myApi;QQmlEngine engine;engine.rootContext()->setContextProperty("_cppApi",&myApi);
MouseArea { onClicked:{stack.push({item:"qrc:/thirdframe.qml});_cppApi.cppSlot("Hello")} }
发布于 2018-06-17 04:59:32
在堆栈上推送qmls之后,对象就可以访问了。因此,当你发出一些信号时,当对象将在堆栈上时,解决方案可能如下所示:
MyClass myClass
QObject *home = object->findChild<QObject*>("homeButton"); // I'm able to connect to every Object in the main.qml or home.qml
QObject::connect(home,SIGNAL(qmlSignal(Qstring)), &myClass, SLOT(cppSlot(QString)));
connect( myClass, MyClass::emitWhenQMLIsAlreadyOnTheStack, this, [this](){
QObject *test = newobject->findChild<QObject*>("test"); // Now you should be able to connect
QObject::connect(test,SIGNAL(qmlSignal(Qstring)), &myClass, SLOT(cppSlot(QString));
});
https://stackoverflow.com/questions/41847939
复制相似问题