gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:35:37 27 4
gpt4 key购买 nike

我的项目包含 6 个 qml 文件:main.qml 打开一个新的 ApplicationWindow 并声明工具栏。它还使用 initalItem homescreen.qml 初始化 StackView。在主屏幕上,我有不同的按钮,可以通过 stack.push("URL") 打开不同的 qml 文件。除了 main.qml,所有文件都以 Item{} 开头。我已经能够连接来自 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//主屏幕之后的随机 qml 文件

    Item {
    Rectangle{
    id: test
    objectName: "test"
    signal qmlSignal(string msg)
    MouseArea {
    onClicked: {stack.push({item:"qrc:/thirdframe.qml}); test.qmlSignal("Hello")}
    }
    }
    }
  • main.cpp

    QApplication app (argc, argv);
    QQmlEngine enigne;
    QQmlComponent component(&engine, QUrl(QStringLiteral("qrl:/main.qml")));
    QObject *object = componet.create();
    QQmlComponent newcomponent(&engine, QUrl(QStringLiteral("qrl:/secondframe.qml")));
    QObject *newobject = newcomponet.create();

    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)));
    QObject *test = newobject->findChild<QObject*>("test"); // Can't connect to the Objects in secondframe.qml
    QObject::connect(test,SIGNAL(qmlSignal(Qstring)), &myClass, SLOT(cppSlot(QString)));

最佳答案

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

  1. 创建一个基于 QObject 的类,该类具有 QML 需要能够作为槽或 Q_INVOKABLE

    调用的方法
    class MyAPI : public QObject
    {
    Q_OBJECT
    public slots:
    void cppSlot(const QString &text);
    };
  2. 创建一个实例并将其公开给 QML

    MyAPI myApi;
    QQmlEngine engine;
    engine.rootContext()->setContextProperty("_cppApi", &myApi);
  3. 在 QML 中将“_cppApi”当作对象 ID 使用

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

关于c++ - 我有多个通过 StackView 推送的 qml 文件。我如何将它们连接到 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41847939/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com