2016-11-14 725 views
2

我需要关闭QML代码的某些部分,因为此代码已用于演示目的,它将在最终版本中删除。但产品将与这些演示功能一起使用很长时间,所以我不能使用具有演示功能的单独分支,并不断将所有新功能合并到该分支 - 这样做不太方便。因此,运行此代码很容易,但在需要时可轻松关闭和/或删除。在C和C++中,我使用ifdef宏,但在QML中可以这样做吗?如何在QML中模拟C风格的“ifdef”宏?

+0

将您的代码放在'Component'中,然后使用所需的组件。 – folibis

回答

3

如果你可以重构这些部分为自己的组件,你有两个选择:

  1. File selectors
  2. Loader

第一个选项也许是有点接近C型#ifdef宏比使用Loader,因为它在文件级工作。只要你不过分使用Loader(例如作为一个大视野的代表),他们都应该做得很好。

+0

感谢您的回答。这两个选项做了不同的事情。我没有(也不能真正制作)单独的组件,我可以动态加载一个文件或一段代码。我宁愿在这里和那里分散一些代码,这些代码会引入一些属性,更改某些函数的流程,使用“Component.onCompleted”等等,所以这两种方法都没有什么帮助,除非我复制一些qml文件%相同,这对我来说似乎是一种矫枉过正。 – rightaway717

+0

不幸的是,我认为你很幸运。 – Mitch

1

#ifdef是一个预处理指令,即在C或C++编译器查看代码之前在构建时处理的东西。 您可以使用您选择的文本处理语言来执行相同的操作,在构建时处理QML文件,然后处理它们,例如由Qt资源编译器。

0

您还可以使用类DebugC与功能

Q_INVOKABLE bool isDebuggingEnable() 
{ 
    #ifdef QT_DEBUG 
    return true; 
    #else 
    return false; 
    #endif 
} 

,然后注册这个类在QML

viewer->rootContext()->setContextProperty("stName", DebugCObj) 

现在你可以很容易地调用stName.isDebuggingEnable()检查,调试方法是启用或不在你的QML文件中。它只是一招

+0

谢谢你的回答。我有2条评论 - 最好使用'QT_NO_DEBUG'或'QT_DEBUG'宏来检查项目是否以调试/发布模式编译,而不是创建一个新的。其次,这将像C#中的'ifdef'这样的普通'if'不像宏一样工作,这有点不同。 – rightaway717

0

QML不编译在运行时解释,所以预处理指令不能被直接QML使用。 但是这不是一个限制,因为它可以从C++端引入QML属性,因此可以将指令放在C++端来处理这些属性,而基于这些属性的决策制定,正常if/then,使用Javascript可以用于QML方面。