QML视频播放器选择文件报错:Cannot assign [undefined] to QUrl
解决QML视频播放器选择文件时的“Cannot assign [undefined] to QUrl”错误
错误原因
你遇到的错误是因为fileDialog.fileUrl在当前使用的QtQuick.Dialogs版本中并非有效属性,导致获取到的值为undefined,而MediaPlayer.source要求QUrl类型,因此赋值失败。
QtQuick.Dialogs的属性在不同版本中有差异:
- Qt 5的QtQuick.Dialogs 1.x版本中,单个文件的URL属性是
fileUrl - Qt 6的QtQuick.Dialogs 2.x版本中,单个文件的URL属性改为
selectedFile
此外你的代码还缺少VideoOutput与MediaPlayer的关联,否则视频无法正常显示;直接将QUrl作为Button文本也会有显示问题。
修正后的代码
针对Qt 6版本
import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Dialogs 1.0 import QtMultimedia ApplicationWindow { id: window width: 640 height: 480 visible: true title: "Video Player" MediaPlayer { id: mediaPlayer } VideoOutput { id: videoOutput anchors.fill: parent source: mediaPlayer // 关联MediaPlayer,确保视频能渲染 } FileDialog { id: fileDialog title: "Select Video File" nameFilters: ["Video Files (*.avi *.mp4 *.mkv)"] selectMultiple: false // 明确启用单选模式 onAccepted: { mediaPlayer.source = fileDialog.selectedFile // 使用Qt 6对应的属性 console.log(fileDialog.selectedFile) mediaPlayer.play() } } Button { text: "Select Video File" anchors.centerIn: parent onClicked: fileDialog.open() } Button { anchors.bottom: parent.bottom anchors.horizontalCenter: parent.horizontalCenter // 将QUrl转为字符串,避免显示异常 text: mediaPlayer.source ? mediaPlayer.source.toString() : "No file selected" } }
针对Qt 5版本
只需将FileDialog的onAccepted代码块中的selectedFile改回fileUrl,并导入对应版本的Dialogs:
import QtQuick.Dialogs 1.3 // ... FileDialog { // ... onAccepted: { mediaPlayer.source = fileDialog.fileUrl console.log(fileDialog.fileUrl) mediaPlayer.play() } }
内容的提问来源于stack exchange,提问作者SIcoder120
相关产品推荐
相关产品推荐

