我正在模型/ View 编程中尝试一个示例。

http://doc.qt.io/qt-5/model-view-programming.html

为了演示如何使用模型索引从模型中检索数据,我们设置了一个没有 View 的QFileSystemModel,并在小部件中显示文件和目录的名称。尽管这没有显示使用模型的正常方法,但是它说明了在处理模型索引时模型使用的约定。

我们通过以下方式构造文件系统模型:

QFileSystemModel *model = new QFileSystemModel;
QModelIndex parentIndex = model->index(QDir::currentPath());
int numRows = model->rowCount(parentIndex);

在这种情况下,我们将设置默认的QFileSystemModel,使用该模型提供的index()的特定实现获取父索引,然后使用rowCount()函数对模型中的行数进行计数。

这是我的代码:
QFileSystemModel* model = new QFileSystemModel;
QModelIndex parentIndex = model->index(QDir::currentPath());
qDebug() << QDir::currentPath();
// "/media/Local Data/Files/Programming/C++/build-DemostrateQModelIndex-Desktop_Qt_5_5_1_GCC_64bit-Debug"
qDebug() << "RowCount is " << model->rowCount(parentIndex);

但是RowCount始终为0。

在“build-DemostrateQModelIndex-Desktop_Qt_5_5_1_GCC_64bit-Debug”文件夹中,里面有文件和文件夹。我希望行数应该是里面的项目数。

我也尝试初始化QFileSystemModel;
QFileSystemModel* model = new QFileSystemModel;
model->setRootPath(QDir::rootPath());
QModelIndex parentIndex = model->index(QDir::currentPath());
qDebug() << "RowCount is " << model->rowCount(parentIndex);

RowCount仍为0。

更新1:
应用约翰内斯·绍布(Johannes Schaub)的建议。我在我的代码中添加了QEventLoop
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QFileSystemModel* model = new QFileSystemModel;
    model->setRootPath(QDir::rootPath());
    QModelIndex parentIndex = model->index(QDir::currentPath());
    qDebug() << QDir::currentPath();
    // "/media/Local Data/Files/Programming/C++/build-DemostrateQModelIndex-Desktop_Qt_5_5_1_GCC_64bit-Debug"
    qDebug() << "First RowCount Call is " << model->rowCount(parentIndex);

    QEventLoop loop;
    QObject::connect(model, &QFileSystemModel::directoryLoaded, &loop, &QEventLoop::quit);
    loop.exec();
    qDebug() << "RowCount Call after eventloop is  " << model->rowCount(parentIndex);

    return a.exec();
}

我仍然得到0的行计数。

最佳答案

QFileSystemModel利用延迟加载和延迟加载。您需要注意其信号,该信号将不断发出,直到加载整个目录为止。

特别是文档说



在您的情况下,您可能会运行本地QEventLoop并将模型的相应信号(directoryLoaded)与事件循环的quit()插槽连接,以等待填充。我不确定canFetchMore和fetchMore是否可以用于这种情况,以阻止等待人口(afaik的主要用途是当用户在无限列表中向下滚动时(例如,facebook的pinwall流)延迟加载)。至少值得尝试。

@Kuba正确地指出,本地事件循环本质上不是必需的。如果您有能力离开创建QFileSystemModel的上下文(例如,通过将其存储为指针成员),并作为常规成员函数在插槽上起作用。

09-06 22:19