По сути, я использую 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);
}
, и это функция, в которой я меняю цвет фона иemit 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, так как он хорошо работает для видимых элементов.Проблема возникает, только если я пытаюсь изменить данные элемента перед его показом!(что довольно странно)
Кто-нибудь знает, что может быть причиной этой проблемы?