Проблемма в том, что при прикручивании всяких рюшечек (кнопочек, слайдера, файлового браузера) начинает сильно подвисать воспроизведение. Соственно самые проблемы возникают при прикручивании слайдера.(можно конечно свой написать, но но интересно потестировать стандартные)
(Основная задача была попробовать написать приложение на чистом qml) Так вот основной вопрос: это я где то ошибаюсь или несовершенство qml?
Файловый браузер не пркладываю тк он работает стабильно.
main.qml
***
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtMultimedia 5.0
import QtQuick.Window 2.1
ApplicationWindow {
id:win
visibility:"FullScreen"
Rectangle{
anchors.fill: parent
id:window
color:"black"
MediaPlayer {
id: mediaPlayer
autoLoad: true
source: "/vidio/Pixar.mp4" //маленькое видио лежит в ресурсах
//autoPlay: true
onError: console.log(mediaPlayer.errorString)
}
VideoOutput{
id: root
anchors.fill:parent
source: mediaPlayer
fillMode: VideoOutput.PreserveAspectFit
}
Rectangle{
width: parent.width/2
height: parent.height/2
anchors.centerIn: window
opacity: 0.0
MouseArea{
anchors.fill:parent
onClicked:{
if(media_tool_bar.state=="open")
{media_tool_bar.state="close"}
else{
media_tool_bar.state="open"}
}
}
}
MediaToolBar{
id:media_tool_bar
width: window.width
z:2
parentHeight: window.height
anchors.bottom: window.bottom
onSliderPush: mediaPlayer.seek(media_tool_bar.slider_value)
onPlayPush: {
console.log(mediaPlayer.availability.toString())
mediaPlayer.play()
}
onPausePush: {
mediaPlayer.pause()
//window.visibility="Maximized"
}
onFolderPush:{
createFileDialog()
}
}
Timer {
id:timer
interval: 1000; running: true; repeat: true
onTriggered: {
if( media_tool_bar.slider_maxValue!=mediaPlayer.duration)
media_tool_bar.slider_maxValue=mediaPlayer.duration
if(mediaPlayer.playbackState==MediaPlayer.PlayingState)
media_tool_bar.slider_value=mediaPlayer.position
}
}
}
function createFileDialog(){ //интересный способ создания динамического окна
if(mediaPlayer.playbackState==MediaPlayer.PlayingState)
mediaPlayer.pause()
var object = Qt.createComponent("FileDs.qml").createObject(window, {"z":3, "width":window.width,"height":window.height});
object.fileHasBeen.connect(fileChoosen) // связывание сигнала и функции
}
function fileChoosen(pathh)
{
mediaPlayer.stop()
mediaPlayer.source=pathh
media_tool_bar.state="open"
}
function playingVideo()
{
mediaPlayer.play()
}
}
***
MediaToolBar.qml
import QtQuick 2.0
import QtQuick.Controls 1.1
Rectangle {
width: 400
height: 60
color: "#9e9fa2"
id: main
radius: 5
property int parentHeight: 300
property bool play_pressed: false
signal playPush()
signal pausePush()
signal folderPush()
property alias slider_maxValue: slider.maximumValue
property alias slider_value: slider.value
signal sliderPush(real slider_value)
Slider{
id:slider
width: parent.width-folder.width-40
anchors.left: parent.left
anchors.leftMargin: 20
height: parent.height
opacity: 0.7
z:4
anchors.verticalCenter: parent.verticalCenter
orientation: Qt.Horizontal
minimumValue: 0
tickmarksEnabled : true
stepSize: 10
onPressedChanged: main.sliderPush(slider.value) // САМОЕ слабое место. В основной документации нет ни слова о //сигналах у этого элемента.
}
Image{
id:play
source: "/image/play.png"
width: main.height*2-10
height: main.height*2-10
anchors.top:parent.top
anchors.topMargin: -parentHeight/2
anchors.horizontalCenter: parent.horizontalCenter
MouseArea{
id: play_pause
anchors.fill: parent
z:1
onClicked: {
main.play_pressed=main.play_pressed==false?true:false
if(main.play_pressed){
play.source="/image/pause.png"
main.state="close"
main.playPush()
}
else{
play.source="/image/play.png"
main.pausePush()
main.state="open"
}
}
}
}
Image {
id: folder
width: main.height-3
height: main.height-3
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
anchors.rightMargin: 10
source: "/image/open-14.png"
MouseArea{
z:1
anchors.fill: parent
onClicked:
main.folderPush()
}
}
states:[
State {
name: "open"
PropertyChanges {
target: main; height:60; opacity:0.4
}
PropertyChanges{
target: slider; height:60; visible:true
}
},
State {
name: "close"
PropertyChanges {
target: main; height:0; opacity:0.2
}
PropertyChanges {
target: slider; height:0; visible:false
}
}
]
state: "open"
transitions: [
Transition {
from: "open"
to: "close"
SequentialAnimation{
PropertyAnimation{
target: main; properties: "opacity"; duration: 100
}
PropertyAnimation{
target: slider; properties: "visible"; duration: 100
}
PropertyAnimation{
target: slider; properties: "height"; duration: 100
}
PropertyAnimation{
target: main; properties: "height"; duration: 100
}
}},
Transition {
from: "close"
to: "open"
SequentialAnimation{
PropertyAnimation{
target: main; properties: "height"; duration: 10
}
PropertyAnimation{
target: main; properties: "opacity"; duration: 10
}
PropertyAnimation{
target: slider; properties: "height"; duration: 1
}
PropertyAnimation{
target: slider; properties: "visible"; duration: 1
}
}
}
]
}