2017-02-20 154 views
1

我有一個Qt應用程序,QML窗口和一個自定義類,即與qmlRegisterType()註冊,這基本上是我main訪問命令行參數

int main(int argc, char *argv[]) 
{ 
    QGuiApplication app(argc, argv); 
    qmlRegisterType<MyType>(...); 
    QQmlApplicationEngine engine; 
    engine.load(QUrl(QStringLiteral("qrc:/MyType.qml"))); 
} 

我有一個重要的命令行選項,即改變的MyType構造,這就是爲什麼我想通過QML訪問命令行參數,我研究了一下,我看到兩個方面至今:

  1. 神祕Qt.Application.arguments,其規格是目前Qt文檔中,直到Qt的5例被r eleased。 Link. 我可以在我的qml文件中訪問Application.arguments,但下一步該怎麼做? QML引擎說它是未定義的類型,我不能像列表一樣訪問它,即Application.arguments[0]給出錯誤TypeError: Cannot read property '0' of undefined
  2. 獲取帶有QCommandLineParser的命令行參數,並以某種方式將它傳遞給我的自定義類,使用qmlRegisterType()註冊。據我瞭解,MyType的構造函數是由QML引擎本身調用的,那麼我怎樣才能將它的參數傳遞給它呢?
+2

'Qt.application.arguments [index]'是調用參數的正確方法,而不是'Application.arguments'。 'Component.onCompleted:console.info(「Executable:」+ Qt.application.arguments [0])'工作得很好。鑑於你不能去選擇1?選項二可能是可行的,但不是開箱即用的。 – BaCaRoZzo

+0

你說得對,通過'Qt.application.arguments [index]'可以訪問參數,主要是因爲缺少文檔而無法獲取參數。順便說一句,Qt Creator也不會自動完成'arguments'。 – Asalle

回答

2

使用[1]中的代碼,你不能僅僅添加argv[](可能首先使它成爲QList

QQuickView view; 
view.rootContext()->setContextProperty("currentDateTime", QDateTime::currentDateTime()); 
view.setSource(QUrl::fromLocalFile("MyItem.qml")); 
view.show(); 

但是,還有另一種方法:你可以實例MyType在那裏,在你main功能,然後使用上面的代碼通過到QML。當然,你必須讓元對象系統知道MyType,但是你已經通過調用qmlRegisterType完成了這個(IIRC)。

絕對看看http://doc.qt.io/qt-5/qtqml-cppintegration-contextproperties.html#setting-a-simple-context-property這應該會給你兩種方法的細節。您正試圖在C++和QML之間共享信息,這必須使用Qt API完成。

[1] http://doc.qt.io/qt-5/qtqml-cppintegration-contextproperties.html#setting-a-simple-context-property

1

如果需要的MyType在構造函數中獲得的參數,那麼你需要在那裏檢索它們:

const QStringList args = QCoreApplication::arguments(); 

通過QML訪問將是爲時已晚,因爲你可以不傳遞構造函數參數。