QML多媒体播放文件夹中的所有mp3

QML Multimedia play all mp3 in a folder

我正在尝试用 QML 构建一个简单的媒体播放器。我无法将 QFile Dialog 用作 EGLFS 上的单个 window 应用程序 运行。到目前为止,我设法为 QML 构建了一个简单的文件浏览器,并且可以从固定位置播放 mp3。但这就是我被困的地方:

  1. 如何将树视图中的当前选定文件设置为我的音频源?

  2. 我怎样才能Audio播放所选文件夹中每个以 mp3 结尾的文件?

感谢您的帮助

.pro 文件

QT += qml quick multimedia widgets
CONFIG += c++11
SOURCES += main.cpp
RESOURCES += qml.qrc
QML_IMPORT_PATH =
QML_DESIGNER_IMPORT_PATH =
DEFINES += QT_DEPRECATED_WARNING
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

main.cpp:

#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QtQml>
#include <QFileSystemModel>


int main(int argc, char *argv[])
{
QApplication app(argc, argv);
app.setOrganizationName("Power-Tune");
app.setOrganizationDomain("power-tune.org");
app.setApplicationName("PowerTune");

QQmlApplicationEngine engine;
//
QFileSystemModel model;
model.setRootPath("/");
engine.rootContext()->setContextProperty("my_model", &model);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));


return app.exec();

}

我的 main.qml :

import QtQuick 2.8
import QtQuick.Controls 2.1
import QtQuick.Layouts 1.1 
import QtQuick.Controls 1.4
import QtMultimedia 5.8

ApplicationWindow {
    visible: true
    width: 800
    height: 480
    minimumWidth: 800
    minimumHeight: 480
    title: qsTr("PowerTune ")
    // visibility: "FullScreen"
    color: "black"
    Rectangle {
        width: parent.width
        height: parent.height
        property bool playing: false
        Audio {
            id: playMusic
            //source: currently selected file in TreeView 
        }
        Button {
            id: previous
            text: "previous"
            width: 100
            anchors.right: playpause.left
            //  onClicked: select previous item in current folder
        }
        Button {
            id: playpause
            text: "play/pause" //playing ? "Stop music" : "Start music"
            width: 100
            anchors.right: next.left
            onClicked: {
                if(playing == true) {
                    playMusic.stop()
                    playing = false
                } else {
                    playMusic.play()
                    playing = true
                }
            }
        }
        Button {
            id: next
            text: "next"
            width: 100
            anchors.right: parent.right
        }
        TreeView {
            id:mp3selector
            width: parent.width/2
            height: parent.height
            TableViewColumn {
                title: "Name"
                role: "fileName"
                width: 300
            }
            model: my_model
        }
    }
}

一些注意事项:

property bool playing: false

最好将属性定义在层次结构的顶部,以便所有子级都可以访问它们,因此最好将其直接放在 ApplicationWindow 而不是 Rectangle 元素中。

而且,我认为 TreeView 不是一个合适的选择(它是 Quick Controls 2.0 中不可用的 Quick Controls 1.0 元素,要进行混合,请检查此 );

你可以直接从 QML 做模型,使用 ListViewFolderListModel,你只需要额外的装饰来突出显示和用鼠标选择文件..就这样,TreeView 可以用下面的代码替换,效果很好!

...
import QtQuick.Controls 2.2
import Qt.labs.folderlistmodel 2.1
...

    ListView {
        id: list
        width: parent.width/2
        height: parent.height
        model: folderModel
        onCurrentIndexChanged: {
            // This will handle changing playlist with all possible selection methods
            playMusic.source = folderModel.get(currentIndex, "fileURL")
        }
        FolderListModel {
            id: folderModel
            folder: "file:///MP3/"
            showDirs: false
            nameFilters: ["*.mp3"]
        }
        delegate: Component {
            Item {
                width: parent.width
                height: 40
                Column {
                    Text { text: fileName }
                }
                MouseArea {
                    anchors.fill: parent
                    onClicked: {
                        list.currentIndex = index
                    }
                }
            }
        }
        highlight: Rectangle {
            color: 'grey'
        }
        focus: true
    }

对于您的按钮 onClicked 只需处理 ListViewcurrentIndex ,例如在 next 按钮中添加:

onClicked: list.currentIndex += 1

您还需要添加一些代码来避免索引超出范围或 -1 ...等等