Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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++ 在ListView中使用QFileSystemModel_C++_Qt_Qml_Qt5_Qfilesystemmodel - Fatal编程技术网

C++ 在ListView中使用QFileSystemModel

C++ 在ListView中使用QFileSystemModel,c++,qt,qml,qt5,qfilesystemmodel,C++,Qt,Qml,Qt5,Qfilesystemmodel,我正在尝试创建一个简单的ListView,可以使用QFileSystem浏览文件系统 首先,我尝试使用我发现适用于QDirModel的代码: main.qml: ListView { id: list width: 300 height: 500 model: DelegateModel { model: myFileModel delegate: Text{

我正在尝试创建一个简单的
ListView
,可以使用
QFileSystem
浏览文件系统

首先,我尝试使用我发现适用于QDirModel的代码:

main.qml:

    ListView {
        id: list
        width: 300
        height: 500

        model: DelegateModel {
            model: myFileModel

            delegate: Text{
                id: txt
                text: fileName

                MouseArea {
                    anchors.fill: parent
                    onClicked: {
                        //Switch directory when clicked
                        list.model.rootIndex = list.model.modelIndex(index);
                    }

                }
            }
        }
ListView {
        id: list
        width: 300
        height: 500

        model: DelegateModel {
            model: myFileModel

            property var ind: myModelIndex

            onIndChanged: {
                rootIndex = myModelIndex //manually reassign root
            }

            delegate: Text{
                id: txt
                text: fileName

                MouseArea {
                    anchors.fill: parent
                    onClicked: {
                        list.model.rootIndex = list.model.modelIndex(index);
                    }

                }
            }
        }
main.cpp:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QQmlApplicationEngine engine;


    QFileSystemModel qdm;
    qdm.setFilter( QDir::NoDotAndDotDot | QDir::Dirs | QDir::Files );

    qdm.setRootPath("/");
    engine.rootContext()->setContextProperty("myFileModel", &qdm);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    return app.exec();
}
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QQmlApplicationEngine engine;

    QFileSystemModel qdm;
    qdm.setFilter( QDir::NoDotAndDotDot | QDir::Dirs | QDir::Files );

    QObject::connect(&qdm, &QFileSystemModel::directoryLoaded, [&](const QString& path){
        //Update model index after directory completely loaded
        engine.rootContext()->setContextProperty("myModelIndex", qdm.index(path));
    });

    qdm.setRootPath("/");
    engine.rootContext()->setContextProperty("myModelIndex", qdm.index(""));
    engine.rootContext()->setContextProperty("myFileModel", &qdm);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    return app.exec();
}
但是,每次
QFileSystemModel
加载文件系统的另一部分时,此代码都会重置
ListView
您可以看到第一次单击新文件夹如何将视图重置为模型的根目录。在第二次尝试时,您还可以看到,在重置视图之前,正确文件夹的内容会显示几秒钟

我的想法是,由于
QFileSystemModel
异步加载其数据,因此模型索引可能在模型更新后失效,从而重置视图。因此,每次发出模型的
directoryLoaded
信号时,我都尝试重新分配
rootIndex

main.qml:

    ListView {
        id: list
        width: 300
        height: 500

        model: DelegateModel {
            model: myFileModel

            delegate: Text{
                id: txt
                text: fileName

                MouseArea {
                    anchors.fill: parent
                    onClicked: {
                        //Switch directory when clicked
                        list.model.rootIndex = list.model.modelIndex(index);
                    }

                }
            }
        }
ListView {
        id: list
        width: 300
        height: 500

        model: DelegateModel {
            model: myFileModel

            property var ind: myModelIndex

            onIndChanged: {
                rootIndex = myModelIndex //manually reassign root
            }

            delegate: Text{
                id: txt
                text: fileName

                MouseArea {
                    anchors.fill: parent
                    onClicked: {
                        list.model.rootIndex = list.model.modelIndex(index);
                    }

                }
            }
        }
main.cpp:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QQmlApplicationEngine engine;


    QFileSystemModel qdm;
    qdm.setFilter( QDir::NoDotAndDotDot | QDir::Dirs | QDir::Files );

    qdm.setRootPath("/");
    engine.rootContext()->setContextProperty("myFileModel", &qdm);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    return app.exec();
}
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QQmlApplicationEngine engine;

    QFileSystemModel qdm;
    qdm.setFilter( QDir::NoDotAndDotDot | QDir::Dirs | QDir::Files );

    QObject::connect(&qdm, &QFileSystemModel::directoryLoaded, [&](const QString& path){
        //Update model index after directory completely loaded
        engine.rootContext()->setContextProperty("myModelIndex", qdm.index(path));
    });

    qdm.setRootPath("/");
    engine.rootContext()->setContextProperty("myModelIndex", qdm.index(""));
    engine.rootContext()->setContextProperty("myFileModel", &qdm);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    return app.exec();
}
然而,结果是完全一样的。我添加了调试代码,模型似乎正确地加载了所有新的目录数据,然后视图的rootIndex发生了变化。但是,每次都会重置视图

此外,我还设置了一个单独的
TreeView
,它还使用
myFileModel
和model as
myRootIndex
作为根索引。这一个很好用。只是ListView(以及GridView)不起作用


据我所知,除了TreeView之外,几乎没有任何关于使用
QFileSystemModel
的信息。我想了解一下正在发生的事情。

FolderListModel不是一个有效的选项?它仍然处于“实验室”的边缘,但我认为它像一个魅力。例如,请参阅或在文档中查找。它也应该用于Qt示例,例如着色器效果示例。@BaCaRoZzo我已经看过了
FolderListModel
,但它不能很好地处理
TreeView
,因为该模型在目标目录中包含的文件/文件夹不多。这没关系,但我也遇到了一些其他问题,例如无法将“/”设置为目标文件夹。它将显示Qt项目目录,而不是显示根目录。而且,底层C++类似乎不可继承,因为它在Qt创建者中没有公开。它似乎纯粹是为了在QML中使用。您想使用
ListView
,不是吗?QML用于
QAbstractListModel
派生类。您当然可以将其设置为与
qabstractemmodel
s一起使用(例如,请参阅我对类似主题的回答)。也就是说,正如我前面所说的,内置示例有一个用QML编写的文件浏览器。你可以找到它。无论如何,解决这里的问题也很有意义。无法详细查看您的代码。希望有人能帮上忙。我想用
GridView
,但是为了这个例子,我用了
ListView
。这两个问题我都有。我也想创建一个浏览器,所以现在我正在研究如何表示文件系统,不幸的是,Qt的所有解决方案都有一些问题或限制,这使得我很难使用它
QFileSystemModel
如果我能让它真正工作,那就太好了。不管怎样,即使你不能直接回答我的问题,你仍然帮助了我。我是Qt5的新手,我吸收了很多信息来学习。我会看看你的链接,也许我能弄明白。