QML中键盘上下箭头输入时Play()函数无法触发视频播放问题
问题根因
你代码的核心问题是焦点事件的接收对象不匹配:Qt Quick ListView 通过键盘上下键切换条目时,默认会将焦点分配给 delegate 的根组件,也就是你代码里的rect1,但你把onFocusChanged回调写在了子组件rect2上。rect2默认没有开启焦点捕获,键盘切换时不会收到焦点变化事件,回调里的播放逻辑自然不会执行。
而点击操作能触发是因为你把MouseArea绑在了rect2上,点击时直接调用了播放逻辑,和焦点事件无关。
修复方案
按以下两步修改即可同时保证焦点高亮正常、视频正常播放:
- 将
onFocusChanged回调从rect2移到根组件rect1上,保证键盘切换时能触发播放逻辑 - 修改
rect2的颜色绑定逻辑,不再绑定自身的focus属性,改为绑定父组件rect1的focus属性,保证焦点高亮显示正确
修改后的delegate代码片段参考:
delegate: Rectangle{ id:rect1 width:75 height:75 color:"#333333" // 把回调移到这里 onFocusChanged:{ if(focus){ console.log("fokus") list.currentIndex=index video.source=url video.play() } } Image{ id:img1 anchors.centerIn: parent source:icon } Rectangle{ id:rect2 width:video.width-rect1.width height:rect1.height anchors.left:rect1.right border.color: "darkgray" // 这里的focus改成rect1.focus color: rect1.focus ? "red" : "#333333" Text{ id:text1 text:uid color:'white' font.pointSize: 14 x:15 y:17 anchors.left: parent } MouseArea{ id:mouse anchors.fill:parent onClicked:{ list.currentIndex=index video.source=url video.play() // 点击时手动给rect1设置焦点,保证点击后焦点高亮也正常 rect1.forceActiveFocus() } } } }
可选优化
如果想更稳妥避免焦点逻辑异常,可以直接监听ListView的currentIndex变化触发播放,不需要依赖焦点事件:
ListView{ id:list // 原有属性不变 onCurrentIndexChanged: { if(currentIndex >= 0) { video.source = xmlModel.get(currentIndex).url video.play() } } }
这样不管是键盘切换还是点击切换条目,只要选中项变化就会触发播放,逻辑更统一。
内容的提问来源于stack exchange,提问作者irena
相关产品推荐
相关产品推荐

