Странное поведение при отправке dataChanged для элемента в QFileSystemModel перед его отображением в окне - PullRequest
0 голосов
/ 03 апреля 2019

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

Кто-нибудь знает, что может быть причиной этой проблемы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...