【问题标题】:Qt QML draw in cpp subclassQt QML 在 cpp 子类中绘制
【发布时间】:2016-09-03 21:34:09
【问题描述】:

所以我试图理解 Qt 中的绘图,但我没有得到这个: 所以首先我有一个 qml 文件,我在其中嵌入了一个名为 Game 的自定义类,它有这个构造函数:Game::Game(QQuickItem *parent) : QQuickItem(parent) 在构造函数代码中写入setFlag(ItemHasContents, true); 足以能够使用QSGGeometry 绘制QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *);(这工作)。现在我尝试使用相同的过程绘制一个子类,但现在它不再工作了:所以我所做的是创建一个名为qcurver 的类,并在游戏中创建一个qcurver 的实例。 QCurver 具有与 Game 相同的构造函数,并且我传递了 Game 的父级,因此从技术上讲,它与 Game 具有相同的父级,但是现在当我尝试在此类中绘制时,什么也没有发生。有谁知道,我如何传递 QML 对象进行绘图,以便我真正看到绘图?

【问题讨论】:

  • 欢迎来到 SO,@Magnus2552!请阅读this 文章如何创建好问题。我认为在发布描述您的问题的适当代码之前,您不会得到正确的答案。

标签: c++ qt qml


【解决方案1】:

您正在从 QML 代码创建一个 Game 对象,因此它已在 QML 场景中正确注册。但是QCurver 不是在那里创建的,所以它不起作用。

是的,它具有相同的父级,但这仅意味着如果父级被删除 - QCurver 也将被删除。 Qt 不会修改所有作为子对象添加的 QObject,以确定它们是否属于 QQuickItem 类型并且应该被渲染。

此外,添加 QML 本身是为了避免在 C++ 中执行小部件层次结构。因此,在 QML 中组合层次结构。或者,如果您出于性能原因需要其中一些在 C++ 中 - 那么可以在 QQuickItem 中执行 QSGNode 层次结构(这对于使用 OpenGL 渲染复杂场景很有用)。

【讨论】:

  • 所以只是为了确保我理解正确:我必须从 QSGNode 继承并在 QQuickItem 中使用继承的类才能使其工作?
  • 不,要使用节点,有必要知道如何使用普通的 OprnGL 来做到这一点。 QSGNode/QSGGeometry 是 OpenGL 的一个薄包装器。
  • 感谢您的帮助,我现在终于可以使用它了。诀窍是创建一个继承自 QSGNode 的自定义类,在其中保存所有不同的 QSGNode(问题是一个 QQuickItem 只能有一个父 QSGNode)。所以在这个自定义类中,你像往常一样有一个父 QSGNode,但所有其他 QSGNode 都是通过 appendChildNode 添加到这个父节点的。这个代码示例对我特别有帮助:qt.apidoc.info/5.2.0/qtquick/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多