Qt c ++ - клонирование объекта - PullRequest
2 голосов
/ 29 января 2012

Я создал свой собственный класс, который содержит Вектор Векторов, каждая позиция содержит собственный QGraphcsItem (диаграмму). Я пытаюсь создать функциональность отмены / повтора, и подход, который я использую, заключается в использовании стека для хранения каждого состояния диаграммы. Я думаю о двух подходах:

  1. Создайте клон верхнего уровня QVector, который, в свою очередь, должен будет клонировать все вложенные векторы внутри него, а затем клонировать все элементы QGraphicsItems. Я полагаю, что могу пройтись по каждому измерению, создать QVector для внешнего цикла, а затем клонировать QGraphicsItem во внутреннем цикле, если только невозможно просто клонировать базовый QVector (и, по сути, клонировать все внутри - в настоящее время все внутри является указателями).

  2. По сути, создайте новый QVector из текущего состояния диаграммы вместо непосредственного клонирования диаграммы. Каждый QGraphicsItem имеет функции get / set для извлечения любых необходимых мне свойств, поэтому я мог бы просто создать новый QVector верхнего уровня, внешний цикл для создания нового QVector для каждой строки, затем внутренний цикл, создающий новые QGraphicsItems, и установить свойства оригинала график.

Есть ли простой способ просто клонировать один предмет, который клонирует все внутри? Или мне нужно реализовать собственную функцию клонирования и «перестроить» текущее состояние?

1 Ответ

2 голосов
/ 31 января 2012

Спасибо за комментарии - я никогда не знал о реализации Qt undo / redo. В итоге я реализовал свой собственный контроль.

Для дальнейшего использования для других с подобной проблемой, я сначала попытался создать новый 2D Вектор, чтобы сохранить «состояние» диаграммы, заполненной QGraphicsItems. Сначала это работало до тех пор, пока диаграмма не стала настолько большой, что генерировала 10 000 новых QGraphicsItems при каждом обновлении диаграммы, а также удаляла текущие 10 000 и добавляла новые 10 000, что было невыносимо медленно.

Я изменил его, чтобы вместо него сохранить 2DVector, который содержал свойства (только QColor, строку и т. Д.) Состояния диаграммы, а не сами QGraphicItems. Это позволило мне просто обновить диаграмму, а не заново создавать диаграмму.

...