c++ - Qt:如何从 C++ 检查对象是否为 QML 类型 Foo

标签 c++ qt types qml

考虑 QML 类型(在 QML 中定义,而不是在 C++ 中定义):

Foo {
}

假设我有一个 C++ 中的 QQuickItem* item 变量。 如何检查变量的类型是否为 Foo?

如果 Foo 是 C++ 类型,我可以这样做:

qobject_cast<Foo*>(item) == nullptr

由于 Foo 是一种 QML 类型,因此一个选项是

item->metaObject()->className().beginsWith("Foo")

(className() 返回类似 Foo_QMLTYPE_0)

但这似乎不可靠且不可靠。

最佳答案

您可以使用魔术键属性:

Foo {
  property bool isFoo : true
}

然后从 C++ 开始:

if (obj->property("isFoo").toBool())

如果对象不具有该属性,则条件应该失败。这也适用于“派生”对象,因为属性将被“继承”,例如,如果某个东西扩展了 Foo 但不一定命名为 FooSomething 而是 SomethingFoo .

当然,会产生一些开销,在需要对许多实例进行大量类型检查的情况下,这种开销可能会很明显。我倾向于做的是在 C++ 级别上有效实现一个 quint32 类型属性,然后从 QML 中将其显式设置在需要类型信息的对象中。这样可以最大限度地减少开销,而且访问速度也比使用 property(name) 更快。​​

关于c++ - Qt:如何从 C++ 检查对象是否为 QML 类型 Foo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41720757/

相关文章:

c++ - 如何使用 QT 从 SVG 文件中获取值

c++ - Qt C++ 将具有非空签名的信号连接到 lambda

c++ - QFile和QTextStream帮助(用Usernames、passwords和names为用户写一个ID)

类类型作为 Scala 映射中的键

C++11:带有 std::thread 和 lambda 函数的段错误

c++ - 新的,Microsoft 除外

c++ - 使用 std::tie 作为循环目标的范围

c++ - 使用 Thrift 在 C++ 中设置 union

Haskell:a -> a 类型函数的示例,除了标识

angular - Angular 形式控件类型中的枚举?