2017-01-25 2 views
2

Мои проекты содержат 6 qml-файлов: Main.qml открывает новый ApplicationWindow и объявляет панель инструментов. Он также инициализирует StackView с initalItem homescreen.qml. На главном экране у меня есть разные кнопки, открывающие разные qml-файлы, через stack.push («URL»). Помимо main.qml все файлы начинаются с Item {}. Я смог подключить сигналы от main.qml и home.qml. Но мне не удалось получить доступ к объектам, которые глубже в стеке. Я не знаю, могу ли я изменить свой код .cpp для доступа к другим объектам, или если я должен изменить инициализацию StackView, чтобы все файлы загружались и были доступны в начале. Вот код, сломалась до самых основ:У меня есть несколько qml-файлов, которые выталкиваются через StackView. Как подключить их к C++

  • 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 // randomw 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))); 
    
+0

Как у secondframe.qml есть доступ к объекту стека? У меня есть приложение с Stackview, которое n страниц. Мне нужно перейти с одной страницы на другую. Как мне это сделать? –

ответ

2

Путь лучше, чем подход, чтобы достичь в дерево QML и вытаскивать предметы, которые могут или не могут быть там, чтобы обеспечить C++ API, основанный на QML.

  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" является идентификатором объекта

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

Спасибо большое !!! Вы программист в супертяжелом весе и очень красивый человек. Я так счастлив, что это прекрасно работает. спасибо за то, что нашли время, чтобы заглянуть в мою проблему. – MilloMille

+4

Чтобы показать вам, что это не секрет, известный только тяжелым программистам, я представляю вам всемогущую Qt-документацию: http://doc.qt.io/qt-5/qtqml- cppintegration-interactiveqmlfromcpp.html – Mailerdaimon

+0

Проделана определенная работа, чтобы сделать эту конкретную документацию более доступной/доступной, но я думаю, что было бы хорошо слышать мнение пользователей; как можно улучшить документацию, могли ли они ее найти и т. д. Предложения всегда приветствуются: bugreports.qt.io – Mitch

Смежные вопросы