Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何用QStringList填充listview?_C++_Qt_Qml - Fatal编程技术网

C++ 如何用QStringList填充listview?

C++ 如何用QStringList填充listview?,c++,qt,qml,C++,Qt,Qml,我正在开发一个应用程序,可以在SD卡中找到所有mp4视频,并在listview中列出它们。按钮用于播放列表中的所有视频,或者单击其中一个视频列表即可播放该视频 我不知道如何实现C++中的QSTRIGLIST与QML中的FLDRET模型之间的连接。也许它应该使用另一种方式用QStringlist填充listview。我在C++端实现了MP4文件的搜索部分,但是不知道如何用存储M4视频文件的QSTRIGNELT填充ListVIEW。请帮忙 源代码: filemodel.cpp #ifndef FIL

我正在开发一个应用程序,可以在SD卡中找到所有mp4视频,并在listview中列出它们。按钮用于播放列表中的所有视频,或者单击其中一个视频列表即可播放该视频

<>我不知道如何实现C++中的QSTRIGLIST与QML中的FLDRET模型之间的连接。也许它应该使用另一种方式用QStringlist填充listview。我在C++端实现了MP4文件的搜索部分,但是不知道如何用存储M4视频文件的QSTRIGNELT填充ListVIEW。请帮忙

源代码:

filemodel.cpp

#ifndef FILEMODEL_H
#define FILEMODEL_H

#include <QObject>
#include <QStringList>
#include <QDirIterator>
#include <QString>

class MyObject : public QObject{
   Q_OBJECT
public:
    explicit MyObject (QObject* parent = 0) : QObject(parent) {}
    Q_INVOKABLE QStringList findfile();
};


QStringList MyObject::findfile( ) {
    QStringList all_dirs;
    QDirIterator it(dir, QStringList() << "*.mp4", QDir::Files, QDirIterator::Subdirectories);
    while (it.hasNext()){
        all_dirs << it.next();
    }
}

#endif // FILEMODEL_H
#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    MyObject obj;
    engine.rootCtontext()->setContextProperty("MyObject", &obj);
    engine.load(QUrl(QLatin1String("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}
qmlRegisterType<FileModel>("com.eyllanesc.filemodel", 1,0, "FileModel");
qmlRegisterType<FileManager>("com.eyllanesc.filemanager", 1,0, "FileManager");
#ifndef文件模型
#定义文件模型
#包括
#包括
#包括
#包括
类MyObject:公共QObject{
Q_对象
公众:
显式MyObject(QObject*parent=0):QObject(parent){}
Q_可调用的QStringList findfile();
};
QStringList MyObject::findfile(){
QStringList所有目录;
QDirIterator it(dir,QStringList()=0&&index0{//processing.mp4
if(player.status==MediaPlayer.EndOfMedia){
if(索引+1
如果你想用C++制作你自己的过滤器,你不应该使用
FolderListModel
,有几种可能

  • 其中之一是为它实现您自己的模型,我们创建了一个继承自
    QAbstractListModel
    的类:

  • 另一种解决方案是使用
    qqmlistproperty
    并公开这些属性:

  • 这两个例子都可以在下面的链接中找到


    为什么要在C++端实现搜索?FolderListModel必须直接在中执行。我不确定使用FolderListModel是否正确。但是,这是在C++端实现搜索的一个好方法,因为我不知道比这更好的其他方法。FolderListModel实现了这个过滤器,并且在您的qml代码中已经实现了:
    nameFilters:[“*.mp4”]
    ,为什么要在C++中进行搜索?您的主要目标是什么?qml中不支持声明类型为
    QList
    的变量,我认为您应该有许多语法错误。您必须创建自己的模型,例如使用QStringListModel。不要使用FolderListModel非常感谢。在目前的水平上,我无法编写这样的代码。你介意推荐一些资源给我来提高我的QT技能吗?对不起。您能演示一下如何使用键盘来控制应用程序吗?我很难做这样的事。请帮帮我。我已经花了三天的时间做那件事了。我的verison就放在这里-
    qmlRegisterType<FileModel>("com.eyllanesc.filemodel", 1,0, "FileModel");
    
    import QtQuick 2.9
    import QtQuick.Controls 2.2
    import QtMultimedia 5.8
    
    import com.eyllanesc.filemodel 1.0
    
    ApplicationWindow {
        visible: true
        width: 640
        height: 480
        title: qsTr("Tabs")
    
        SwipeView {
            id: swipeView
            anchors.fill: parent
            currentIndex: tabBar.currentIndex
    
            Page {
    
                ListView {
                    id: lv
                    width: 200; height: 400
    
                    Component {
                        id: fileDelegate
                        Text { text: fileName
                            MouseArea{
                                anchors.fill: parent
                                onClicked: playMusic(index)
                            }
                        }
                    }
    
                    model: FileModel{
                        id: myModel
                        folder: "/home/eyllanesc"
                        nameFilters: ["*.mp4"]
                    }
    
                    delegate: fileDelegate
                }
    
                Button {
                    id: button
                    anchors.top: lv.bottom
                    width: parent.width
                    text: "Play"
                    background: Rectangle {
                        implicitHeight: 40
                        border.color: "#26282a"
                        border.width: 2
                        radius: 4
                    }
                    onClicked: playMusic(0)
                }
            }
    
            Page {
                MediaPlayer {
                    id: player
                    onStopped: {
                        if(status===MediaPlayer.EndOfMedia){
                            playMusic((lv.currentIndex+1) % lv.count)
                        }
                    }
                }
    
                VideoOutput {
                    id: video
                    anchors.fill: parent
                    source: player
                }
            }
        }
    
        function playMusic(index){
            player.stop()
            player.source = myModel.get(index).url
            player.play()
            swipeView.setCurrentIndex(1)
        }
    
        footer: TabBar {
            id: tabBar
            currentIndex: swipeView.currentIndex
    
            TabButton {
                text: qsTr("Page 1")
            }
            TabButton {
                text: qsTr("Page 2")
            }
        }
    }
    
    #ifndef FILEMANAGER_H
    #define FILEMANAGER_H
    
    #include <QDirIterator>
    #include <QFileInfo>
    #include <QFuture>
    #include <QObject>
    #include <QQmlListProperty>
    #include <QUrl>
    #include <QVector>
    #include <QtConcurrent>
    
    class File: public QObject{
        Q_OBJECT
        Q_PROPERTY(QString fileName READ fileName CONSTANT)
        Q_PROPERTY(QUrl url READ url CONSTANT)
    public:
        File(const QString fullPath="", QObject *parent = nullptr):QObject(parent){
            mFullPath = fullPath;
        }
        QString fileName() const
        {
            return QFileInfo(mFullPath).fileName();
        }
        QUrl url() const{
            return QUrl::fromLocalFile(mFullPath);
        }
    
    private:
        QString mFullPath;
    };
    
    class FileManager : public QObject
    {
        Q_OBJECT
        Q_PROPERTY(QQmlListProperty<File> files READ files NOTIFY filesChanged)
        Q_PROPERTY(QString folder READ folder WRITE setFolder NOTIFY folderChanged)
        Q_PROPERTY(QStringList nameFilters READ nameFilters WRITE setNameFilters NOTIFY nameFiltersChanged)
    public:
        explicit FileManager(QObject *parent = nullptr):QObject(parent){}
        QQmlListProperty<File> files(){
            return QQmlListProperty<File>(this, this,
                                          &FileManager::filesCount,
                                          &FileManager::file);
        }
    
        QString folder() const
        {
            return mFolder;
        }
    
        void setFolder(const QString &folder)
        {
            if(mFolder == folder)
                return;
            mFolder = folder;
            emit folderChanged();
            findFiles();
        }
    
        int filesCount() const{
            return mFiles.count();
        }
    
        File *file(int index) const{
            return mFiles.at(index);
        }
        QStringList nameFilters() const{
            return mNameFilters;
        }
    
        void setNameFilters(const QStringList &nameFilters){
            if(mNameFilters == nameFilters)
                return;
            mNameFilters = nameFilters;
            emit nameFiltersChanged();
            findFiles();
        }
    
    signals:
        void folderChanged();
        void filesChanged();
        void nameFiltersChanged();
    private:
    
        void findFiles( ) {
            mFiles.clear();
            if(QDir(mFolder).exists()){
                QFuture<QStringList> future = QtConcurrent::run([=]() {
                    QStringList files;
                    QDirIterator it(mFolder, mNameFilters, QDir::Files, QDirIterator::Subdirectories);
                    while (it.hasNext()){
                        files<<it.next();
                    }
                    return files;
                });
    
                for(const QString& fullName:  future.result()){
                    File* file = new File(fullName);
                    mFiles << file;
                }
            }
            emit filesChanged();
        }
    
        static int filesCount(QQmlListProperty<File>* list){
            return reinterpret_cast<FileManager* >(list->data)->filesCount();
        }
        static File* file(QQmlListProperty<File>* list, int index){
            return reinterpret_cast<FileManager* >(list->data)->file(index);
        }
        QVector<File *> mFiles;
        QString mFolder;
        QStringList mNameFilters;
    };
    
    #endif // FILEMANAGER_H
    
    qmlRegisterType<FileManager>("com.eyllanesc.filemanager", 1,0, "FileManager");
    
    import QtQuick 2.9
    import QtQuick.Controls 2.2
    import QtMultimedia 5.8
    
    import com.eyllanesc.filemanager 1.0
    
    ApplicationWindow {
        visible: true
        width: 640
        height: 480
        title: qsTr("Tabs")
    
        FileManager{
            id: manager
            folder: "/home/eyllanesc"
            nameFilters: ["*.mp4"]
        }
    
        SwipeView {
            id: swipeView
            anchors.fill: parent
            currentIndex: tabBar.currentIndex
    
            Page {
    
                ListView {
                    id: lv
                    width: 200; height: 400
    
                    Component {
                        id: fileDelegate
                        Text { text: fileName
                            MouseArea{
                                anchors.fill: parent
                                onClicked: playMusic(index)
                            }
                        }
                    }
    
                    model: manager.files
                    delegate: fileDelegate
                }
    
                Button {
                    id: button
                    anchors.top: lv.bottom
                    width: parent.width
                    text: "Play"
                    background: Rectangle {
                        implicitHeight: 40
                        border.color: "#26282a"
                        border.width: 2
                        radius: 4
                    }
                    onClicked: playMusic(0)
                }
            }
    
            Page {
                MediaPlayer {
                    id: player
                    onStopped: {
                        if(status===MediaPlayer.EndOfMedia){
                            playMusic((lv.currentIndex+1) % lv.count)
                        }
                    }
                }
    
                VideoOutput {
                    id: video
                    anchors.fill: parent
                    source: player
                }
            }
        }
    
        function playMusic(index){
            player.stop()
            player.source = manager.files[index].url
            player.play()
            swipeView.setCurrentIndex(1)
        }
    
        footer: TabBar {
            id: tabBar
            currentIndex: swipeView.currentIndex
    
            TabButton {
                text: qsTr("Page 1")
            }
            TabButton {
                text: qsTr("Page 2")
            }
        }
    }