我正在模型/ 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
的上下文(例如,通过将其存储为指针成员),并作为常规成员函数在插槽上起作用。