Qt qml MediaPlayer VideoOutput如何在单独的线程中运行?
假设有这样一个代码(对不起,这是人为的代码) 当标签数量增加时,视频开始中断。如何在单独的线程中启动视频,以便对任何小部件的操作都不会中断它(视频)Qt qml MediaPlayer VideoOutput如何在单独的线程中运行?,qt,qml,Qt,Qml,假设有这样一个代码(对不起,这是人为的代码) 当标签数量增加时,视频开始中断。如何在单独的线程中启动视频,以便对任何小部件的操作都不会中断它(视频) 您不应该重载主线程(使用它的事件循环)。否则,整个软件将滞后,不仅仅是视频输出 不要移动到另一个线程—优化良好且高效的控件。转移到另一个线程,进行大量的、艰苦的和漫长的计算 所以 避免使用间隔较短的计时器,或者如果您使用计时器,不要将其固定在硬物上 如果您应该在QML中创建多个或硬控件,那么使用Loader或QQmlIncubator,它们允许
- 避免使用间隔较短的计时器,或者如果您使用计时器,不要将其固定在硬物上
- 如果您应该在QML中创建多个或硬控件,那么使用
或Loader
,它们允许在单独的线程中创建QML控件。另外,QQmlIncubator
允许动态加载和卸载所需/不需要的控件。因此,QML引擎不会呈现太多控件,其中大部分甚至不可见。 关于Loader
/Loader
:它们在单独的线程中创建控件,而不是在那里运行QQmlIncubator
- 避免在QML控件中编写自定义属性和函数,将它们放在某个单独的QtObject:
QtObject{id:internals;…所有自定义数据…}
- 使用
而不是ListView
。它更高效,因为它只实例化可见的项目(以及一些不在可见区域内的项目)对于您的示例来说可能是最重要的Repeater
- 性能注意事项和建议:
- QML性能提示和技巧:
- QtObject:
Window {
id: window
visible: true
width: 700
height: 700
MediaPlayer {
id: mediaplayer
source: "test.avi"
autoPlay: true
}
VideoOutput {
anchors.fill: parent
source: mediaplayer
}
Repeater {
id: repeater
property int n: 1
model: 1
Label {
function getRandomInt(max) {
return Math.floor(Math.random() * Math.floor(max))
}
id: label
y: getRandomInt(window.width)
x: getRandomInt(window.height)
text: "label"
}
}
Timer {
interval: 10
running: true
repeat: true
onTriggered: {
repeater.n += 1
if (!(repeater.n % 100)) {
repeater.model = repeater.n
}
}
}
}