2014-11-08 15 views
1

我正在爲我的QML + C++應用程序構建一個插件系統。插件是QML文件。 的QML文件看起來是這樣的:從C++中的QML文件加載屬性

項{ 標題: 「性感插件」 版本: 「1.0」 }

如何我讀C之內的標題和版本++?

回答

1

最簡單的方法是用C++編寫QuickItem。即使它只是一個小組件,它只是標題和版本。然後在C++及其最簡潔的方法中輕鬆訪問它,從而將視圖和邏輯分離。然後,您可以使用衆所周知的Q_PROPERTY宏來定義屬性。

如果你真的想使用只能設爲Qml編寫的組件,並且不希望C++編寫任何東西,有在此頁面中提到的解決方案:http://qt-project.org/doc/qt-5/qtqml-cppintegration-interactqmlfromcpp.html

引述有關部分從「的訪問員QML Object Type from C++「:

QQmlEngine engine; 
QQmlComponent component(&engine, "MyItem.qml"); 
QObject *object = component.create(); 

qDebug() << "Property value:" << QQmlProperty::read(object, "someNumber").toInt(); 
QQmlProperty::write(object, "someNumber", 5000); 

qDebug() << "Property value:" << object->property("someNumber").toInt(); 
object->setProperty("someNumber", 100); 

所以QQmlProperty可能會幫助你。

因爲我不知道,你的目標是什麼,我不會推薦任何東西。無論如何,在我看來,僅僅用C++編寫Item的第一種方法在很多情況下比從Qml獲取屬性更清晰。

+0

當使用「component.create()」時,它會創建一個新的實例嗎?如果我有兩個C++文件,這兩個文件都想訪問已經創建的QObject。如何實現?謝謝! – user1914692 2015-08-31 20:35:01

2

每個QML項繼承QObject直接或間接的,所以你可以使用元系統的讀寫性能「動態」。

QVariant QObject::property(const char * name) const 

返回對象的名稱屬性的值。如果不存在此類 屬性,則返回的變體無效。

如果該項目恰好是根項目,你可以使用QQuickItem * QQuickView::rootObject() const得到它,如果沒有,你將不得不設置objectName : QString屬性,繳費每一個QObject派生的對象,並從根對象調用findChild<QObject*>("name")