如何将自定义角色添加到 QFileSystemModel
How to add a custom role to QFileSystemModel
我想向QFileSystemModel(可能是派生模型(添加一个自定义角色。我想使用此角色来保存复选框的检查状态,该复选框显示在自定义委托中的文件名旁边。如何做到这一点?
我使用示例Qt快速控件 - 文件系统浏览器示例删除了选择的一部分。
步骤如下:
-
在
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) } } } ...
完整的示例可以在以下链接中找到。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 如何在C++中从两个单独的for循环中添加两个数组
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 如何仅为一个函数添加延迟
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 如何将更多文件夹添加到c++include路径
- 如何将元素添加到数组的线程安全函数?
- QT通过C++添加映射QML项目
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 只能向C++添加一定数量的字符
- Qt和C++:将QLineEdit添加到QTabWidget中
- 将QIcon添加到QTableView单元格
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- 将图像添加到资源文件夹UWP C++
- 当我尝试添加 2 个大字符串时,我无法弄清楚出了什么问题