在窗口中显示之前,为QFileSystemModel中的项目发射dataChanged时出现奇怪的行为

时间:2019-04-03 00:12:21

标签: c++ qt

基本上,我正在使用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类无关,因为它对可见项正常工作。仅当我尝试在显示项目之前更改项目的数据时,才会发生问题! (这很奇怪)

有人知道这个问题的可能原因吗?

0 个答案:

没有答案