C++ QML多媒体在文件夹中播放所有mp3

C++ QML多媒体在文件夹中播放所有mp3,c++,qt,audio,qml,multimedia,C++,Qt,Audio,Qml,Multimedia,我正在尝试用QML构建一个简单的媒体播放器。我不能将QFile对话框用作在EGLFS上运行的单个窗口应用程序。到目前为止,我成功地为QML构建了一个简单的文件浏览器,可以在固定位置播放mp3。但这就是我被困的地方: 如何将树视图中当前选定的文件设置为音频源 如何从所选文件夹中获取音频播放每个以mp3结尾的文件 谢谢你的帮助 .pro文件 QT += qml quick multimedia widgets CONFIG += c++11 SOURCES += main.cpp RESOURCES

我正在尝试用QML构建一个简单的媒体播放器。我不能将
QFile
对话框用作在EGLFS上运行的单个窗口应用程序。到目前为止,我成功地为QML构建了一个简单的文件浏览器,可以在固定位置播放mp3。但这就是我被困的地方:

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

  • 如何从所选文件夹中获取
    音频
    播放每个以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();
    
    }
    
    几点注意:

    property bool playing: false
    
    属性最好在层次结构的顶部定义,以便在所有子级中都可以访问,因此更愿意将其直接放在
    ApplicationWindow
    中,而不是放在
    Rectangle
    元素中

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

    您可以直接从QML创建模型,使用带有
    FolderListModel
    ListView
    ,您只需要额外的装饰来突出显示和使用鼠标选择文件。。仅此而已,
    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
        }
    

    对于单击的按钮,只需处理
    列表视图的
    currentIndex
    ,例如在下一个按钮中添加:

    onClicked: list.currentIndex += 1
    

    您还需要添加一些代码,以避免索引超出范围或-1…等等。

    对不起,我的代码实际上有“上一步”和“下一步”按钮。我只是将代码的相关部分粘贴为“上一个”和“下一个”,目前不做任何操作。刚刚纠正了嗨,对不起,我开车去上班。我使代码示例现在可以独立执行。我想在树状视图中只显示扩展名为*.mp3的文件,然后将playmusic的源设置为当前选定的路径,并使用选定的文件名是的,这也是一个好主意。它只需要能够显示文件夹和驱动器,因为我计划在raspberry pi上使用它,并且音乐99%的时间都在外部U盘上
    onClicked: list.currentIndex += 1