60 QVariant
data(
const QModelIndex &index,
int role)
const override {
61 if (index.isValid() && role == Qt::EditRole) {
63 auto iter = std::next(m_data.begin(), index.row());
64 if (iter == m_data.end()) {
68 if constexpr (std::is_same_v<DATA, QVariant>) {
70 }
else if constexpr(std::is_base_of_v<QObject, DATA>) {
71 QQmlEngine::setObjectOwnership(*iter, QQmlEngine::CppOwnership);
73 return QVariant::fromValue(*iter);
75 }
else if constexpr (std::is_same_v<DATA, QSharedPointer<QObject>> ||
76 std::is_base_of_v<QObject, typename DATA::element_type>) {
77 QObject* ptr = iter->get();
79 QQmlEngine::setObjectOwnership(ptr, QQmlEngine::CppOwnership);
80 return QVariant::fromValue(ptr);
82 return QVariant::fromValue(*iter);
96 auto&& val = m_data.value(key);
97 if constexpr (std::is_same_v<DATA, QVariant>) {
99 }
else if constexpr(std::is_base_of_v<QObject, DATA>) {
100 QQmlEngine::setObjectOwnership(val, QQmlEngine::CppOwnership);
102 return QVariant::fromValue(val);
104 }
else if constexpr (std::is_base_of_v<QSharedPointer<QObject>, DATA>) {
105 QObject* ptr = val.get();
107 QQmlEngine::setObjectOwnership(ptr, QQmlEngine::CppOwnership);
108 return QVariant::fromValue(ptr);
110 return QVariant::fromValue(val);
127 auto&& iter = m_data.find(key);
128 if (iter != m_data.end() || *iter !=
data) {
130 int insertIdx = std::distance(m_data.begin(), m_data.insert(key,
data));
131 emit dataChanged(index(insertIdx, 0),
132 index(insertIdx, 0));
153 const int diff = newData.size() - m_data.size();
156 beginInsertRows(QModelIndex{}, m_data.size(), m_data.size() + diff - 1);
160 emit dataChanged(index(0, 0),
161 index(m_data.size() - diff - 1, 0));
162 }
else if (diff == 0) {
165 emit dataChanged(index(0, 0),
166 index(m_data.size() - diff - 1, 0));
168 beginRemoveRows(QModelIndex{}, m_data.size() + diff, m_data.size() - 1);
173 emit dataChanged(index(0, 0),
174 index(m_data.size() - 1, 0));