原文:Interacting with QML Objects from C++
將QML物件載入C++中
QQmlComponent和
和QQuickView
都可以將QML載入成C++ Object並且透過C++的程式碼去改變它的內容。但是QQuickView
的不同處在於它是一個QWindow的子類別,被載入的QML將會被渲染並且顯示出來,所以QQuickView
通常被用來包裝可以被顯示的QML,作為使用者界面。
首先,這裡有一個MyQml.qml
文件
import QtQuick 2.0 //也可以是較高的版本
Item {
width : 200
height : 200
}
透過QQuickView載入QML
QQuickView view ;
view.setSource(QUrl::fromLocalFile("MyQml.qml")) ;
view.show() ;
QObject *object = view.rootObject() ;
QQuickView會自動建立QML的實例,所以可以直接透過呼叫QQuickView::rootObject()
這個函式就可以值得到。
透過QQmlComponent載入QML
QQmlEngine engine ;
QQmlComponent component ( &engine , QUrl::fromLocalFile("MyQml.qml") ) ;
QObject *object = component.create() ;
利用QQmlComponent
如果想要得到QML的實例,與QQuickView
不同的是要透過QQmlComponent::create()
來建立QML的實例。
可以透過這種方法去改變物件的特性
object->setProperty( "width" , 500 ) ;
QQmlProperty(object,"width").write(500) ;
不過其實封裝好的QML真正類別是QQuickItem
,所以也可以透過這種方法去改變物件的特性,以確保編譯時能正常執行(compile-time safety)。
QQuickItem *item = qobject_cast<QQuickItem*>(object) ;
item->setWidth(500)
利用objectName存取QML物件
findChild範例
因為QML的rootObject底下還有很多的QML Object,形成一個樹狀結構,所以常常需要對其下的子物件做一些控制。可以透過QObject::findChild<class>
來