基本上,我正在使用QFileSystemModel在QTreeView中显示文件夹的内容。
有时我需要更改项目的数据(例如,背景色)。因此,我创建了一个继承QFileSystemModel的自定义模型,可以在其中应用这些更改并发出dataChanged。这是.h文件中的类定义:
class CustomModel : public QFileSystemModel {
//...
Q_OBJECT
QSet<QPersistentModelIndex> highlight;
//...
public slots:
bool changeItemHighlight(const QModelIndex& index, bool highlightItem);
private slots:
QVariant data(const QModelIndex& index, int role) const;
};
这是.cpp文件上的数据功能:
QVariant CustomModel::data(const QModelIndex& index, int role) const {
if (role == Qt::BackgroundColorRole && highlight.contains(index))
return QColor("#CCFFCC");
if (role == Qt::TextColorRole && highlight.contains(index))
return QColor("#000000");
if (role == Qt::CheckStateRole && this == musicModel && std::find (supportedAudioFormats.begin(), supportedAudioFormats.end(), fileInfo(index).suffix()) != supportedAudioFormats.end())
return checklist.contains(index) ? Qt::Checked : Qt::Unchecked;
return QFileSystemModel::data(index, role);
}
这是我更改背景颜色并发出dataChanged的函数:
bool CustomModel::changeItemHighlight(const QModelIndex& index, bool highlightItem) {
if (highlightItem) highlight.insert(index);
else highlight.remove(index);
QVector<int> rolesChanged;
rolesChanged.append(Qt::BackgroundColorRole);
rolesChanged.append(Qt::TextColorRole);
rolesChanged.append(Qt::CheckStateRole);
emit dataChanged(index, index, rolesChanged);
return true;
}
当我更改可见项的数据时,效果很好。但是,由于我使用的是树状视图,因此修改的项目并不总是可见的。在这种情况下,会发生一个奇怪的问题:项目数据已修改,但我无法再访问该文件。当我尝试在修改其数据后打开文件时,出现以下错误:
gio: file:/<FILE_PATH>: Error when getting information for file “<FILE_PATH>”: No such file or directory
我认为这与我的CustomModel类无关,因为它对可见项正常工作。仅当我尝试在显示项目之前更改项目的数据时,才会发生问题! (这很奇怪)
有人知道这个问题的可能原因吗?