0
点赞
收藏
分享

微信扫一扫

Qt Qml 中动态创建 & 销毁视频容器技巧

棒锤_45f2 2023-03-13 阅读 75

Qt Qml 中动态创建 & 销毁视频容器技巧(一)

1、写在前面

上一篇我们已经实现了 Qml 在播放直播视频流。

然而,对于用户来说,很多时候并不需要进入软件就立即播放视频。

并且,不同类型视频应当有不同的 ​​操作&工具&界面​​。

例如:全景的操作和界面应该和相机 (球机 / 枪机)不同,因为后者需要操作云台(PTZ);又比如实时视频和回放视频界面也不一样。

因此,最好的方式是实现一种容器,通过类型来实例化为不同类型的视频实例,这里简单讲解一下实现。

2、正文开始

一般来讲,Qml 中动态创建对象有两种方式:

  • 使用 JavaScript:Qt.createComponent() / Qt.createQmlObject()。

使用 Qt.createComponent() + Qt.createObject() 的组合或者 Qt.createComponent() + Qt.incubateObject() 的组合.

要销毁它们,只需调用 ​​destroy(int msec)​​, 参数为销毁的延时。

例如下面的的 ​​SelfDestroyingRect.qml​​,

然后在需要时使用 ​​destroy()​​ 销毁即可:

import QtQuick 2.14

Rectangle {
id: rect
width: 80; height: 80
color: "red"

NumberAnimation on opacity {
to: 0
duration: 1000

onRunningChanged: {
if (!running) {
console.log("Destroying...")
rect.destroy();
}
}
}
}

想要动态创建, 只需在 ​​JS 块​​​ 中调用 ​​Qt.createComponent() + Qt.createObject()​​ 即可:

import QtQuick 2.14

Item {
id: container
width: 500; height: 100

Component.onCompleted: {
var component = Qt.createComponent("SelfDestroyingRect.qml");
for (var i=0; i<5; i++) {
var object = component.createObject(container);
object.x = (object.width + 10) * i;
}
}
}

另一方面,对于每一个 ​​Component​​​ 组件,也可直接调用它的 ​​createObject()​​ 函数动态创建。

  • 使用 Loader。

很简单,我们可以先声明一个Loader,然后通过动态设置它的 source / sourceComponent 来动态创建.

区别是,source 是 url ( 即 qml 文件,实际上每一个 qml 文件就是一个 Component ),而 sourceComponen 则是 Component。

销毁动态创建的方式也很简单,置空:​​source = ""​​​ 或 ​​sourceComponent = undefined​​ 即可。

例如( SelfDestroyingRect.qml 来自上面 ):

import QtQuick 2.14

Item {
width: 200; height: 200

Loader { id: pageLoader }

MouseArea {
anchors.fill: parent
onClicked: pageLoader.source = "SelfDestroyingRect.qml"
}
}

如果要销毁 (这里是一秒后自动销毁):

Timer {
running: true
interval: 1000
onTriggered: {
pageLoader.source = "";
}
}

关于SkeyeARS

SkeyeARS全景AR增强监视系统, 是视开科技开发的一款基于宽场景多路视频无缝拼接、视频实时增强、监视目标增强显示、目标自动跟踪、视频存储回放、远程数据传输和多通道全景视频同步显示等功能的综合视频AR增强监视系统,广泛应用于智慧交通、智慧城市、智慧机场等大场景智能监控领域。



举报

相关推荐

0 条评论