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

标签 c++ qt qml qt5 qtquick2

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

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

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

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

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

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

最佳答案

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

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

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

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

关于c++ - Qt QML : UI with dynamic number of images provided by c++ code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41451469/

相关文章:

c++ - QTcpSocket 状态始终连接,即使拔掉以太网线

c++ - 使用临时数据表修复内存泄漏(堆与堆栈)

QML:如何将子级添加到基本组件的子级而不是组件的根对象?

c++ - BB10 - 从 C++ 更改 QML header 标题

ios - Qt Quick iOS:如何在后台运行应用程序时保持音频播放

c++ - 使用 swap 作为函数而不是在算法本身中更快地编码

c++ - OpenAL 2d 平移 C++

android - 我应该能够在 Android 上创建/etc/myApp 目录吗?

c++ - 如何通过c++_中不同目录中的文件使用变量

c++ - 是否可以在没有接收器实例的情况下将信号连接到静态插槽?