Разная политика перетаскивания для разных модельных индексов в QAbstractItemModel

У меня есть древовидная модель, которая содержит группы, которые могут содержать элементы и вложенные группы. Все группы видны в корне модели, но они могут также появиться как элементы группы.

Я хотел бы разрешить следующие операции:

Это означает:

  • Группы могут быть удалены только внутри групп, но не в корневом элементе.
  • Элементы внутри групп не могут быть перемещены в другие группы или в корневой элемент. Их можно перемещать только внутри этой группы (вверх и вниз).
  • (это работает) Корневой элемент принимает элементы из другого представления (здесь не показано)

В настоящее время вот как я устанавливаю флаги для элементов:

Qt::ItemFlags ImportGroupListModel::flags(const QModelIndex & index) const
{
    Qt::ItemFlags flags = Qt::NoItemFlags;
    if (index.isValid()) {
        ImportGroupModelItem* item = static_cast<ImportGroupModelItem*>(index.internalPointer());
        if (item != nullptr) {
            if (ITEM IS ROOT ELEMENT) {
                flags = flags | Qt::ItemFlag::ItemIsDropEnabled | Qt::ItemFlag::ItemIsEnabled;
            }
            if (ITEM IS TOP GROUP)
                flags = flags | Qt::ItemIsDragEnabled;
            if (ITEM IS TOP OR NESTED GROUP) {
                flags = flags | Qt::ItemFlag::ItemIsDropEnabled | Qt::ItemFlag::ItemIsEnabled | Qt::ItemFlag::ItemIsSelectable;
            }
            if(ITEM IS ENTRY) {
                flags = flags | Qt::ItemFlag::ItemIsEnabled | Qt::ItemFlag::ItemIsSelectable;
            }
        }
    }
    return flags;
}

Поэтому я хочу разрешить внутреннее перемещение только для любого модельного индекса, который не является корневым индексом. Как это сделать?

0 ответов

Другие вопросы по тегам