2017-02-13 56 views
0

我是QML的新手,無法解決一個簡單的問題。我想從C++訪問QML組件,但我不能。 指針test總是0.可能是什麼原因?從C++訪問現有的QML組件

的代碼如下:

的main.cpp

int main(int argc, char *argv[]) 
{ 
    QGuiApplication &app=reg6::Bonder::BonderGuiApplication::instance(); 
    QQmlApplicationEngine engine; 
    engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 

    QObject* test=engine.rootObjects().first()->findChild<QObject*> ("cameraArea"); 
    test->setProperty("color","black"); 

    return app.exec(); 
} 

main.qml

import QtQuick 2.5 
import QtQuick.Controls 1.4 
import QtQuick.Dialogs 1.2 
import QtQuick.Layouts 1.0 

ApplicationWindow { 
visible: true 
width: 1800 
height: 900 

SplitView 
{ 
    anchors.fill: parent 
    orientation: Qt.Vertical 
    SplitView { 
     Layout.fillHeight: true 
     SplitView { 
      orientation: Qt.Vertical 
      width:400 
      Layout.minimumWidth: 400 
      Layout.maximumWidth: 500 

      Camera { 
       id: cameraArea 
       height: 400 
       Layout.maximumHeight: 400 
       Layout.minimumHeight: 300 
      } 
      List { 
       id: listArea 
      } 
     } 

     Bonder { 
      id: mainArea 
      Layout.fillWidth: true 
     } 

     Properties { 
      id: propertiesArea 
      Layout.minimumWidth: 300 
      Layout.maximumWidth: 400 
     } 
    } 
    Error { 
     id: errorArea 
     Layout.minimumHeight: 100 
     height: 200 
    } 
} 
} 

Camera.qml

import QtQuick 2.5 
Rectangle { 
    color: "lightblue" 
} 

回答

1

你必須設置objectName財產QML組件的得到一個有效的指針到您的QObject因爲T QObject::findChild(const QString &name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const需要objectName不是ID

+1

我想回答這樣的問題可以沒有來自文檔的**警告**是完整的。它只是鏈接標題上方的段落[here](http://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html#accessing-members-of-a-qml-object-type-from -C)。它始於:**警告:** *雖然可以使用C++訪問和操作深入對象樹中的QML對象,但我們建議您不要在應用程序測試和原型設計之外採用此方法。 ] * – derM

+0

@derM事實上,相反的方式要好得多。 –

+0

@derM你是對的,但它不回答問題** Lecko **問,所以現在的答案是完整的。 – Redanium