2017-02-20 156 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访问将是为时已晚,因为你可以不传递构造函数参数。