gpt4 book ai didi

c++ - QFileSystemModel rowCount 不能按预期工作

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:01:12 24 4
gpt4 key购买 nike

我正在尝试模型/ 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 利用惰性和延迟加载。您需要观察它的信号,这些信号会不断发出,直到整个目录加载完毕。

特别是,文档说

Unlike QDirModel, QFileSystemModel uses a separate thread to populate itself so it will not cause the main thread to hang as the file system is being queried. Calls to rowCount() will return 0 until the model populates a directory.

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

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

关于c++ - QFileSystemModel rowCount 不能按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33544645/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com