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