如何基于QFileSystemModel在TableView中访问Qt::DisplayRole并指定列?
嘿,结合你给出的QFileSystemModel::data函数代码,我给你分两种场景说明怎么操作:
一、让TableView自动显示指定列的DisplayRole内容
QFileSystemModel和TableView绑定后,TableView默认会调用模型的data函数,使用Qt::DisplayRole来渲染每一列的内容,完全契合你贴出的代码逻辑(列0返回文件名、列1返回大小、列2返回类型、列3返回时间)。
要指定显示哪些列,直接操作TableView即可:
- 先完成模型和TableView的绑定:
QFileSystemModel *fileModel = new QFileSystemModel(this); fileModel->setRootPath(QDir::currentPath()); // 设置要显示的根目录 ui->tableView->setModel(fileModel);
- 隐藏不需要的列(比如只保留列0和列1):
// 隐藏列2(类型)和列3(时间) ui->tableView->hideColumn(2); ui->tableView->hideColumn(3);
这样TableView就只会展示列0(文件名)和列1(大小)的Qt::DisplayRole内容了。
二、手动获取指定列的Qt::DisplayRole数据
如果需要在代码里主动获取某一行某一列的Qt::DisplayRole数据(比如做额外的逻辑处理),可以通过QModelIndex定位后调用model->data():
// 定位到根目录下第2行、第1列的项(行号从0开始) QModelIndex targetIndex = fileModel->index(1, 1, fileModel->rootIndex()); // 获取该位置的Qt::DisplayRole数据 QVariant displayData = fileModel->data(targetIndex, Qt::DisplayRole); // 输出结果,比如列1返回的是文件大小 qDebug() << "目标单元格内容:" << displayData.toString();
这里的index(row, column, parentIndex)参数要注意:
row和column是目标单元格的行号、列号parentIndex用fileModel->rootIndex()表示根目录下的直接子项,如果你要访问子文件夹里的项,需要传入对应子文件夹的QModelIndex
补充:对应你给出的data函数逻辑
当你传入Qt::DisplayRole和指定列的QModelIndex时,模型的data函数会进入对应的分支:
case Qt::EditRole:
case Qt::DisplayRole:
switch (index.column()) {
case 0: return d->displayName(index); // 列0返回文件名
case 1: return d->size(index); // 列1返回文件大小
case 2: return d->type(index); // 列2返回文件类型
case 3: return d->time(index); // 列3返回修改时间
}
所以只要正确指定QModelIndex的列,就能拿到对应列的Qt::DisplayRole数据啦。
内容的提问来源于stack exchange,提问作者maxwell

