QML多媒体播放文件夹

时间:2018-04-09 04:36:42

标签: c++ qt audio qml multimedia

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

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

  2. 如何从所选文件夹中获取Audio播放文件结尾为mp3的每个文件?

  3. 感谢您的帮助

    .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
            }
        }
    }
    

1 个答案:

答案 0 :(得分:2)

几个笔记:

property bool playing: false

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

并且,我认为TreeView不是一个合适的选择(它是Quick Controls 2.0中没有的Quick Controls 1.0元素,混合检查这个post);

您可以使用带有ListView的{​​{1}}直接从QML创建模型,您只需要额外的装饰来突出显示和选择带有鼠标的文件..这就是全部,{{1} }可以用下面的代码替换,它的工作和花哨!

FolderListModel

对于您的按钮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 } 的{​​{1}},例如在 next 按钮中添加:

onClicked

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