首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我有多个qml文件是通过StackView推送的。如何将它们连接到C++

我有多个qml文件是通过StackView推送的。如何将它们连接到C++
EN

Stack Overflow用户
提问于 2017-01-25 17:31:47
回答 2查看 3K关注 0票数 3

My Projects包含6QMLFiles: main.qml打开一个新的ApplicationWindow并声明工具栏。它还使用initalItem homescreen.qml初始化StackView。在主屏幕上,我有不同的按钮,通过stack.push(网址)打开不同的qml文件。除了main.qml之外,所有文件都以项目{}开头。我已经能够连接来自main.qml和home.qml的信号。但我一直无法访问堆栈中更深的对象。我不知道我是否必须更改我的.cpp代码来访问其他对象,或者我是否应该更改StackView的初始化,以便所有文件在开始时都被加载和访问。以下是代码,分解到最基本的部分:

  • main.qml

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“}

}

  • secondframe.qml //主屏幕后的随机w qml文件

项目{ Rectangle{ id:测试objectName:“测试”信号qmlSignal(string msg) MouseArea { onClicked:{stack.push({ Item :"qrc:/thirdframe.qml});test.qmlSignal("Hello") }

  • main.cpp

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))中的对象

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-25 18:18:39

比进入QML树并提取可能存在或不存在的对象更好的方法是向QML提供基于C++的API。

  1. 创建一个基于QObject的类,该类具有QML作为插槽或Q_INVOKABLE调用所需的方法。

类MyAPI :公共QObject { Q_OBJECT公共插槽:空cppSlot(const QString &text);};

  • 创建该实例并将其公开给QML

MyAPI myApi;QQmlEngine engine;engine.rootContext()->setContextProperty("_cppApi",&myApi);

  • 在QML中使用,就像"_cppApi“是一个对象id一样。

MouseArea { onClicked:{stack.push({item:"qrc:/thirdframe.qml});_cppApi.cppSlot("Hello")} }

票数 3
EN

Stack Overflow用户

发布于 2018-06-17 04:59:32

在堆栈上推送qmls之后,对象就可以访问了。因此,当你发出一些信号时,当对象将在堆栈上时,解决方案可能如下所示:

代码语言:javascript
复制
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));
});
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41847939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档