gpt4 book ai didi

c++ - 来自 C++ 的 QQuickItem 实例化和设置难题(不允许将任何内容传递给构造函数)

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:24:48 26 4
gpt4 key购买 nike

我发现自己在尝试从 C++ 中动态实例化自定义 QML 元素时陷入困境。

因此,对问题进行布局:

  • 我有一个从任何 UI 中抽象出来的轻量级 Node 对象数据结构。
  • 由于 QObject 和派生占用大量内存,我必须按需实例化 UI 元素。
  • 每个 Node 都有一个 _ui* 成员,每个 UI 都有一个 _node* 成员。<
  • 每个Node都有一个唯一的_id,每个UI都有一个ID PROPERTY,从 _node* 交付。 ID 属性是只读的,因为 ID 是在 Node 实例化时设置的,不应修改。
  • QML 元素只能有带有默认参数的构造函数,例如不能将任何东西传递给构造函数。
  • 创建 QML 元素时,_node* 成员为 NULL,因此 UI 的任何 QML 子元素都试图访问该 ID property 不能,因为 _node* 不是在实例化时设置的,它只能通过 aux 方法设置,但由于 property 实际上是一个只读常量,它在实例化后不再更新当 UI_node* 成员实际设置时。

所以基本上,我需要能够在创建时设置指向每个 UI 的相应 Node 的链接,以便 UI 可以访问它 QML 元素,但我无法将其传递给构造函数,并且由于该属性是只读的,因此在 UI 实例化时,当 _node* UI成员仍然是NULL,所以无法访问ID值。

我想到的一个快速而肮脏的解决方案是添加一个 NOTIFY idChanged() 信号以在设置 _node* 成员时发出后实例化,即使 ID 属性从未真正改变,不能也不应该,并添加对 ID getter 的检查 - 如果 _node*NULL,则返回一个假的虚拟任意值>,否则从 _node* 成员中获取 ID 值。不用说,这并不优雅,并且增加了一些开销,而且虚拟 ID 值是一个潜在的蠕虫 jar 头,所以欢迎任何关于如何克服 QML 内部不良设计的想法。

最佳答案

我刚刚提出了一个解决方案,而且是一个相当简单的解决方案。考虑到 QtQuick 的设计方式不允许指定构造函数参数,并且考虑到“创建和设置”方法在我的特定使用场景中具有巨大的影响,我决定简单地使该值可用于/在 UI 构造函数,即使没有作为参数传递给那里也是如此。

因此,我只是执行“设置和创建”,而不是“创建和设置”,并使用在创建每个项目之前设置并在项目构造函数中及时设置数据的静态类成员。

class UI : public QQuickItem
{
Q_OBJECT
public:
explicit UI(QQuickItem * parent = 0);
...
private:
Object * object;
static UI * rootUI;
};

Object * UI::protoObject = 0;

UI::UI(QQuickItem * parent) : QQuickItem(parent), object(protoObject) {
if (!protoObject) qDebug() << "ERROR: prototype object is 0, unexpected";
...
}

和实际的对象创建:

UI::setProtoObject(obj);
// create QQmlComponent with obj set being set in the constructor
UI::setProtoObject(0);

此外,另一种适用于不需要尽早在构造函数中设置对象的方法是创建 QQmlComponentbeginCreate(),设置所需的属性,并使用 completeCreate()

完成

关于c++ - 来自 C++ 的 QQuickItem 实例化和设置难题(不允许将任何内容传递给构造函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20962750/

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