Qt QML:UI 具有由 C++ 代码提供的动态图像数

Qt QML: UI with dynamic number of images provided by c++ code

我正在设计一个应用程序,本质上,它获取我想要以网格模式显示的一些图像(这些图像会发生变化 - 想想几个视频,每个视频由许多图像组成,按顺序显示)。这种模式应该是可扩展的,我希望能够动态控制行数和列数。

C++ 核心应用程序以不同的速度提供这些图像。它需要知道将它们发送到哪里。

我和我的团队已经创建了一个符合其中一些要求的原型:我们能够实例化一个基于 C++ 的对象,派生自 QQuickPaintedItem,它在覆盖的 [=12= 中绘制其图像] 方法。在 QML 中,其中的几个随后被实例化,并且它们按照我的预期显示它们的图像。但是,图像内容是硬编码的,并且由于这些对象在 QML 中实例化,我不确定如何从我的 C++ 核心应用程序控制它们的内容。此外,我们动态排列它们的方式是一种极其肮脏的黑客攻击,源于反复试验,并且仅略微接近其预期效果:只要按下 "add one more" 按钮,实例就会被简单地销毁并重新创建。

我的问题应该是设计原则的问题。即使在检查了几个示例并进行了进一步研究之后,我仍不确定将核心应用程序和 QML 代码结合起来以实现我想要的效果的最佳方法是什么。

这里正确的方法是什么?我怀疑模型和视图可能是要走的路,因为我相信我可以通过 C++ 将播放器组件添加到模型中,因此可以在那里访问它们,而 QML 会......以某种方式......处理显示和安排。

对于这个相当模糊的问题,我深表歉意,我希望你能帮助我指出正确的方向,关于我可以使用哪些机制将 QML 和 C++ 结合起来以达到我的目的。

QPaintedItem 是不必要的,可能会造成性能开销。

如前所述,您真正需要做的是实现一个 QQuickImageProvider,它可以让您 do C++ / QML image interop.

那么不管你需要行、列还是网格,这些都是模型驱动的,你不一定要实现C++模式,QML的ListModel就足够了,你真正需要的是字符串的列表模型,表示自定义图像提供程序的图像源。

每次你有一个来自 C++ 的新图像时,你可以从 C++ 端发出一个带有图像源字符串的信号,你可以在 QML 端连接一个处理程序来向模型添加一个列表项。将发射对象作为上下文公开给 QML 属性。一旦发出信号,新的图像源就会添加到模型中并自动显示在视图中。差不多就这些了。