Как добавить пользовательскую роль в QFileSystemModel - PullRequest
0 голосов
/ 04 мая 2018

Я хотел бы добавить пользовательскую роль в QFileSystemModel (возможно, в производную модель). Я хочу использовать эту роль для сохранения состояния проверки CheckBox, которое отображается рядом с именем файла в пользовательском делегате. Как это можно сделать?

1 Ответ

0 голосов
/ 04 мая 2018

Я использовал, используя пример Qt Quick Controls - Пример браузера файловой системы удаление части выделения.

Шаги были следующие:

  • Добавить новую роль в roleNames:

    QHash<int,QByteArray> roleNames() const Q_DECL_OVERRIDE
    {
        QHash<int, QByteArray> result = QFileSystemModel::roleNames();
        result.insert(SizeRole, QByteArrayLiteral("size"));
        result.insert(DisplayableFilePermissionsRole, QByteArrayLiteral("displayableFilePermissions"));
        result.insert(LastModifiedRole, QByteArrayLiteral("lastModified"));
        result.insert(Qt::CheckStateRole, QByteArrayLiteral("checkRole"));
        return result;
    }
    
  • Создайте контейнер, в котором будет храниться информация выбора, в этом случае я буду использовать QMap:

    QMap<QPersistentModelIndex, Qt::CheckState> m_checks;
    
  • Перезаписать метод data(), который возвращает состояние, если оно хранится в контейнере, если оно не возвращается Qt::UnChecked в качестве значения по умолчанию:

    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE
    {
        if (index.isValid() && role >= SizeRole) {
            ...
        }
        else if (role == Qt::CheckStateRole) {
            QPersistentModelIndex pix(index);
            if(m_checks.contains(pix)){
                return m_checks[pix];
            }
            return Qt::Unchecked;
        }
        return QFileSystemModel::data(index, role);
    }
    
  • Перезаписать метод setData(), который необходимо изменить при необходимости и создать данные.

    bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole){
        if(role == Qt::CheckStateRole && index.isValid()){
    
            Qt::CheckState current = value.value<Qt::CheckState>();
            if(m_checks.contains(index)){
                Qt::CheckState last = m_checks[index];
                if(last == current)
                    return false;
                m_checks[index] = current;
            }
            else{
                m_checks.insert(index, current);
            }
            emit dataChanged(index, index, {role});
            return true;
        }
        return QFileSystemModel::setData(index, value, role);
    }
    
  • Я добавил новый столбец, в котором я установил делегат для CheckBox, и я использовал слот onCheckedChanged для установки значения с помощью метода setData(), передается QModelIndex, данные и роль, в этом случае, проходят 10, потому что это число значения Qt::CheckStateRole.

    TreeView {
        id: view
        model: fileSystemModel
        ...
    
        TableViewColumn {
            role: "checkRole"
            delegate: Component {
                CheckBox {
                    id: mycbx
                    checked: styleData.value
                    onCheckedChanged: view.model.setData(styleData.index, checked, 10)
                }
            }
        }
    ...
    

Полный пример можно найти по следующей ссылке .

...