我发现自己在尝试从 C++ 动态实例化自定义 QML 元素。
所以,要布局问题:
Node
我有一个从任何 UI 中抽象出来的轻量级对象数据结构。- 由于内存繁重
QObject
且派生,我必须按需实例化 UI 元素。 - 每个
Node
人都有一个_ui*
成员,每个UI
人都有一个_node*
成员。 - 每个
Node
都有一个独特的_id
,每个UI
有一个ID
PROPERTY
,交付自_node*
。ID 属性是只读的,因为 ID 是在Node
实例化时设置的,不应修改。 - QML 元素必须只有带有默认参数的构造函数,例如不能向构造函数传递任何东西。
- 当 QML 元素创建时,
_node*
成员是,因此任何试图访问 ID 属性的NULL
QML 子元素都不能,因为实例化时没有设置,只能通过 aux 方法设置,但由于该属性实际上是一个只读常量,实例化后,当实际设置的成员时不再更新。UI
_node*
_node*
UI
所以基本上,我需要能够在创建时将链接设置Node
为每个对应的链接UI
,以便UI
QML 元素可以访问它,但我不能将它传递给构造函数,并且由于属性是只读的,因此它被读取只有一次,在UI
实例化时,当_node*
UI
成员仍然是时NULL
,因此无法访问 ID 值。
想到的一个快速而肮脏的解决方案是NOTIFY
idChanged()
在设置成员后实例化时添加一个要发出的信号,_node*
即使 ID 属性从未真正改变,不能也不应该,并添加对 ID getter 的检查 - 返回一个假虚拟如果_node*
是任意值,否则从成员中NULL
获取 ID 值。_node*
不用说,这并不优雅,并且增加了一些开销,并且虚拟 ID 值是潜在的蠕虫罐头,因此欢迎任何关于如何击败 QML 内部不良设计的想法。