gpt4 book ai didi

qt - 如何在 QML 中模拟 C 风格的 "ifdef"宏?

转载 作者:行者123 更新时间:2023-12-04 12:49:25 30 4
gpt4 key购买 nike

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

最佳答案

正如@Mark 所建议的那样,可以在QML 中使用上下文属性来决定是否启用了某个宏,但是他提供的示例并未解决这种情况,当您需要根据此决定实例化对象时,但仅在代码块内覆盖大小写。因此,我将提供我所做的完整示例。

在我的例子中,我只在编译期间定义了宏时才向 QML 公开一个类:

主.cpp :

#ifdef SMTP_SUPPORT
qmlRegisterType<SmtpClientHelper>("com.some.plugin", 1, 0, "SmtpClient");
engine.rootContext()->setContextProperty("SMTP_SUPPORT", QVariant(true));
#else
engine.rootContext()->setContextProperty("SMTP_SUPPORT", QVariant(false));
#endif // SMTP_SUPPORT

然后在 QML 方面,我检查这个宏并决定是否必须创建 SmtpClient 对象:

qml :
import QtQuick 2.0;
import com.some.plugin 1.0

Item {
id: root
// ...

property var smtpClient // No inside any function, need to instantiate the object

Component.onCompleted: {
if (SMTP_SUPPORT) {
smtpClient = Qt.createQmlObject(' \
import QtQuick 2.0; \
import com.some.plugin 1.0; \
SmtpClient { \
id: smtpClient; \
\
function setSenderEmail(email) { \
senderEmail = email; \
storage.save("common", "clientEmail", email); \
} \
} \
', root, "SmtpClient");
}
}

// Reference smtpClient normally, like if it was statically created
TextInput {
id: senderEmailLogin
anchors.fill: parent
font.pixelSize: Globals.defaultFontSize
text: smtpClient ? smtpClient.senderEmail : ""
onEditingFinished: if (smtpClient) smtpClient.setSenderEmail(text)
activeFocusOnPress: true
}
}

我认为 Loader 也应该完成这项工作,因此您可以创建一个单独的组件,在 Loader 的 source 中引用它或 sourceComponent如果定义了 C++ 宏的属性,但我不确定,因为不确定是否(在我的情况下) SmtpClient 是否会静态检查此组件类型可用

关于qt - 如何在 QML 中模拟 C 风格的 "ifdef"宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40584490/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com