Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QGraphicsScene -> QTableView 
:(
    Опции темы
wowka19
Дата 30.4.2014, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



Есть QGraphicsScene, есть QGraphicsView. Теперь нужно еще чтобы элементы сцены (а именно надписи) отображались в QTableView. Как это правильней сделать - ума не приложу. Просто не хочется дублировать эл-ты в QTableWidget.
При этом нужно как сохранить двустороннюю связь-соответствие: элемент сцены <-> строка в таблице, т.е. чтоб можно было обратившись строке таблицы идентифицировать (перейти к) QGraphicsItem на сцене и наоборот. Как-то можно без костылей? без новых сущностей

Это сообщение отредактировал(а) wowka19 - 30.4.2014, 22:49
PM MAIL   Вверх
math64
Дата 1.5.2014, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Нужно создать класс SceneTableModel, который должен отслеживать удаление и добавление итемов на сцену. Он может содержать у себя, например, QList<QGraphicsItem*> - в зависимости от надобности, либо все итемы на сцене, либо только QGraphicsTextItem и QGraphicsSimpleTextItem и собственные итемы, содержащие текст. Причем использовать собственные итемы для текста удобнее, т.к. можно добавить собственные сигналы на их изменение, которых нет у стандартных.
PM   Вверх
wowka19
Дата 2.5.2014, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



Насколько я понимаю SceneTableModel должен наследовать Qt-шную модель, которая потом присоединится к QGraphicsView. Так?
Если да, то можно подробнее?
PM MAIL   Вверх
math64
Дата 2.5.2014, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Код

// Модификация своего кода - могут быть ошибки
class SceneListModel : public QAbstractListModel {
   Q_OBJECT
public:
    explicit SceneListModel(QGraphicsScene* _scene) {
      scene = _scene;
      findItems();
      // Не совсем тот слот, что нужен, но при добавлении и удалении итемов будут изменения на сцене
      connect(scene, SLOT(changed(const QList<QRectF>)), this, SLOT(sceneChanged()));
    }
    virtual ~SceneListModel();
    virtual int rowCount(const QModelIndex &parent = QModelIndex()) const {
      return items.count();
    }
    // Получение данных по итему из списка items
    virtual QVariant data(const QModelIndex &index, int role) const;
private:
    void findItems(); // Поиск итемов на сцене, заполнение списка items
private slots:
    void sceneChanged() {
      findItems();
      emit dataChanged(index(0), index(rowCount()-1));
    }
private:
   QGraphicsScene* scene;
   QList<QGraphicsItem*> items;
};

PM   Вверх
wowka19
Дата 3.5.2014, 02:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



Спасибо. Хорошо, есть у меня SceneListModel со сценой и списком указателей на итемы. Я реализую методы работы с ними (добавить/удалить/...) но как мне идентифицировать итемы в сцене и списке? сравнивать адреса?
А может можно как-то обойтись без списка итемов? ведь QGraphicsScene - это по сути тот же самый контейнер. Вот только как идентифицировать в нем итемы?

С каким методом модели нужно работать, чтобы известить вид об изменении модели (при вставке/удалении строки)?

Это сообщение отредактировал(а) wowka19 - 3.5.2014, 08:29
PM MAIL   Вверх
math64
Дата 3.5.2014, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Список - для ускорения работы. Кроме того, в списке итемы будут лежать в том порядке, какой тебе нужен - он не обязательно будет такой, какой на сцене, при изменениях на сцене желательно сохранять порядок в списке не изменившихся итемов. В списке лежат указатели на итемы, сами итемы принадлежат сцене - так что дублирование минимально.
по возможности, место emit dataChaged() лучше делать emit rows{AboutToBe}{Inserted/Removed/Moved}() и т.д.
PM   Вверх
math64
Дата 3.5.2014, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



У класса QGraphicsScene есть метод items() - он возвращает список всех итемов на сцене. Если его скорость и порядок итемов тебя устраивает, можешь не хранить копию списка итемов у себя.
PM   Вверх
wowka19
Дата 4.5.2014, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



Цитата(math64 @  3.5.2014,  17:29 Найти цитируемый пост)
 emit rows{AboutToBe}{Inserted/Removed/Moved}() и т.д. 
 - извини, не понял

и предыдущий вопрос:
Цитата(wowka19 @  3.5.2014,  02:37 Найти цитируемый пост)
С каким методом модели нужно работать, чтобы известить вид об изменении модели (при вставке/удалении строки)?

т.е. вот я добавил на сцену итем и добавил указатель на него в список. Теперь как известить модель или вид (не знаю что именно) об изменениях?

Это сообщение отредактировал(а) wowka19 - 4.5.2014, 13:00
PM MAIL   Вверх
math64
Дата 4.5.2014, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Нормально при вставке строк модель должна вызывать
emit rowsAboutToBeInserted()
а затем
emit rowsInserted()
аналогично при удалении и перемещении.
Но эти сигналы private, поэтому вместо них нужно вызывать
Код

    void beginInsertRows(const QModelIndex &parent, int first, int last);
    void endInsertRows();
    void beginRemoveRows(const QModelIndex &parent, int first, int last);
    void endRemoveRows();

Но если с моделью произошли сложные изменения, вызывается
Код

emit dataChanged(topLeft, rightBottom)

но при этом будет потеряно выделение.
Если ты используешь собственные итемы, можно создать свой производный класс сцены, в котором добавить свои сигналы при добавлении, удалении, и перемещении итемов - в обычной сцене этих сигналов нет, приходится довольствоваться сигналом changed() - который вызывается чаще и не позволяет различать эти события.
Другой способ - в том месте кода, где ты добавляешь итемы на сцену, после этого нужно вызвать свой метод модели, вызывающий соответствующие emit.

Это сообщение отредактировал(а) math64 - 4.5.2014, 15:08
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0529 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.