@Mercury13
Программист на «си с крестами» и не только

QAbstractItemModel::beginInsertRows: что происходит, если вставка не удалась?

В потомке QAbstractItemModel функция вставки может сказать: вставка по какой-то причине невозможна. Аварий не выкидываем, проверяем коды ошибок.
1. Как в такой ситуёвине поведёт себя endInsertRows?
2. Можно ли изменить классы данных за пределами beginInsertRows/endInsertRows, а между этими функциями ничего не делать?
3. А если и то, и другое нет — какую лучше придумать архитектуру вставки?
  • Вопрос задан
  • 105 просмотров
Решения вопроса 1
@Mercury13 Автор вопроса
Программист на «си с крестами» и не только
Я пока придумал такую конструкцию…
class Committer {  // interface
public:
  virtual void commit() = 0;
  virtual ~Committer() = default;
}

enum class ErrCode { OK, UNCLONEABLE, BAD_RECIPIENT };

struct CommitObj {
  ErrCode errCode;
  std::unique_ptr<Committer> action;
}

class UiObj {
public:
  virtual CommitObj startClone(std::shared_ptr<UiObj> recipient) = 0;
}


Мы или получаем объект, для которого а защищённом блоке достаточно дать commit(), или причину, почему клонирование невозможно.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Griglapidus
C++/Qt
Какую проблему вы пытаетесь решить?
beginInsertRows/endInsertRows нужны что бы предупредить views о вставке.
Мне сложно представить ситуацию в которой вы вызвали beginInsertRows но не смогли вставить данные. Если есть опасения можно проверить данные зарание и только потом их вставлять.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы