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

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

本文关键字:动态 UI 图像 QML c++ 代码 Qt      更新时间:2023-10-16

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

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

我和我的团队已经创建了一个符合其中一些要求的原型:我们能够从QQuickPaintedItem派生出一个基于C++的对象,该对象在覆盖的paint(QPainter *painter)方法中绘制其图像。在QML中,其中的几个会被实例化,并如我所期望的那样显示它们的图像。然而,图像内容是硬编码的,由于这些对象在QML中被实例化,我不确定如何从C++中的核心应用程序控制它们的内容。此外,我们动态排列它们的方式是一种源自试错的极其肮脏的黑客攻击,其效果仅与预期效果接近:只要按下"再添加一个"按钮,实例就会被简单地销毁和重新创建。

我的问题可能是设计原则的问题。即使在研究了几个例子和进一步的研究之后,我也不确定将核心应用程序和QML代码结合起来以实现我想要的目标的最佳方式是什么。

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

我对这个相当模糊的问题感到抱歉,我希望你能帮助我找到一些正确的方向,关于我可以使用哪些机制来组合QML和C++。

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

如前所述,您真正需要做的是实现一个QQuickImageProvider,它可以允许您执行C++/QML映像互操作。

然后,无论您需要行、列还是网格,这些都是由模型驱动的,您不必实现C++模式,QML的ListModel就足够了,因为您真正需要的只是一个字符串列表模型,代表自定义图像提供程序的图像源。

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