如何将自定义角色添加到QFileSystemModel

时间:2018-05-04 15:39:59

标签: c++ qt qml qt5 qfilesystemmodel

我想将自定义角色添加到QFileSystemModel(可能是派生模型)。我想使用此角色来保存CheckBox的检查状态,CheckBox显示在自定义委托中的文件名旁边。怎么办呢?

1 个答案:

答案 0 :(得分:1)

我已经使用示例Qt Quick Controls - File System Browser Example删除了部分内容。

步骤如下:

  • 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()方法设置了值{ {1}}被传递,数据和角色在这种情况下通过10,因为它是QModelIndex的值。

    Qt::CheckStateRole

完整示例可在以下link中找到。