qt - 有没有办法在 Qt5 qml 中做 C++ 宏?
问题描述
我有两个 qml 插件,我只想在运行时或启动应用程序时导入选择的插件,以便我可以使用单个变量来表示其中一个插件。例如,我想要类似于使用 C++ MACRO 但在 qml 中类似的东西:
#ifdef WHICH_PLUGIN
import generic_plugin_A 1.0 as myPlugin
#else
import generic_plugin_B 1.0 as myPlugin
#endif
...
// then I can use myPlugin for calls/signals/... as long as both generic plugins have the same UI interface
...
我可以让它工作的方法是创建第三个插件 generic_plugin_C,我在 qml 中导入它,然后将该插件从 UI 连接到 generic_plugin_A/B。我只是想知道是否有一种不同或更清洁的方式来做这件事会更好。
我正在尝试的另一种方法是使用 qmlResisterType 在 main.cpp 中实现它:
main.cpp
:
...
if (WHICH_PLUGIN)
qmlRegisterType<PluginA_ClassName>("genericplugin", 1, 0, "PluginA_ClassName");
else
qmlRegisterType<PluginB_ClassName>("genericplugin", 1, 0, "PluginB_ClassName");
...
然后在我的 qml 文件中:
import genericplugin 1.0
...
genricplugin.funcCall()
...
我希望在 qml 中使用相同的变量名称和信号/qproperty/invokable/etc,当时选择了哪个插件。
解决方案
在我看来,要走的路是通过 Loader 有条件地加载 qml 文件。这些文件每个都有自己不同的导入。
有关详细信息,请参阅此答案:https ://stackoverflow.com/a/52434062/1423877 。
推荐阅读
- android - ChildEventListener 导致 IndexOutOfBoundsException
- shiny - 在“折叠”状态下以闪亮的方式启动 widgetUserBox
- r - 如何使用一个测量为 0-7 的变量和另一个具有两个类别的变量进行卡方检验?
- sql - SQLite 多表列信息传输
- php - 选择框名称值的问题 - 可以隐藏它吗?
- node.js - node.js + nodemon、babel 和 dotenv
- amazon-web-services - 为什么我的失败事件没有发送到 AWS Dead Letter Queue DLQ?
- python - 针对特定用例的 Python 线程与异步
- plc - 如何为电机中的控制器状态创建时序?
- javascript - p5.js loadPixels() 与用户上传返回全零数组