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

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

В потомке QAbstractItemModel функция вставки может сказать: вставка по какой-то причине невозможна. Аварий не выкидываем, проверяем коды ошибок.
1. Как в такой ситуёвине поведёт себя endInsertRows?
2. Можно ли изменить классы данных за пределами beginInsertRows/endInsertRows, а между этими функциями ничего не делать?
3. А если и то, и другое нет — какую лучше придумать архитектуру вставки?
  • Вопрос задан
  • 151 просмотр
Решения вопроса 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 но не смогли вставить данные. Если есть опасения можно проверить данные зарание и только потом их вставлять.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
CTRL+ Москва
от 250 000 до 320 000 ₽
CTRL+ Москва
от 200 000 до 300 000 ₽
CTRL+ Белград
от 250 000 до 320 000 ₽
22 нояб. 2024, в 00:55
500 руб./за проект
21 нояб. 2024, в 23:30
300000 руб./за проект
21 нояб. 2024, в 22:21
3000 руб./в час