Russian Qt Forum
Сентябрь 30, 2024, 08:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как сохранить QGraphicsItemы выведенные на QGraphicsScene в файл?  (Прочитано 7567 раз)
AntonUfo
Гость
« : Январь 29, 2009, 14:55 »

Привет всем !!!

С программированием прям скажем не очень Грустный возникло два вопроса немогу разобраться:

В программе по клику мышки вывожу на QGraphicsView энное количество Item-ов, определяю для них различные параметры (цвет, шрифт и т.д.) теперь вопросы:
1. как "обойти" все выведенные Item с первого до последнего
(QList <QGraphicsItem *> item как дальше ?)

2.Как сохранить все итемы в двоичный файл:

мои Itemы

Код:
class MyItems : public QGraphicsItems
{
}



Код:

void MyClass::save()
{
 QFile file("file.bin");

 if(file.open(QIODevice::WriteOnly)){
  QDataStream stream(&file);
  stream.setVersion(QDataStream::Qt_4_4);
 
  stream <<  ; //что писать в эту строчку

  if (stream.status() !=QDataStream::Ok) {
      qDebug() << "Error`s";
  }

  }
 file.close();
}


очень хочется разобраться...

Спасибо!


Записан
Rcus
Гость
« Ответ #1 : Январь 29, 2009, 15:38 »

1. Возможно не понял вопроса, но foreach?
2. это уже зависит от ваших пожеланий, например сохранять позицию, трансформацию, вложенный список подчиненных и т.д.... Но помоему проще будет сохранить информацию на основе которой они были созданы.
Записан
AntonUfo
Гость
« Ответ #2 : Январь 29, 2009, 16:49 »

Так в том то и дело что я незнаю как !!!

Пусть в моем классе определены две преременные:
public:
   int Number;
   QString name;

я нарисовал 10 Итемов, присвоил им их номера и имена , как теперь мне записать в двоичный файл ?

Item Number Name
1        1         a
2        2         b
3        3         c


я немогу понять как мне использовать итераторы !!!

У меня класс производный от QGraphicItem , нужно ли мне использовать "сериализацию", не пойму никак что это такое ?

« Последнее редактирование: Январь 29, 2009, 16:53 от AntonUfo » Записан
Swappp
Гость
« Ответ #3 : Январь 29, 2009, 22:15 »

Так это вроде элементарные вещи... И кстати к 2D и 3D графики отношения не имеют Улыбающийся
Можно например перегрузить оператор << у класса унаследованного от QGraphicItem. В итоге получится что то вроде того:
Код:
foreach(o, list)
{
  file<<o;
}
а в самом методе operator<< соответственно писать нужные параметры в файл (поток). Чтение потом можно реализовать например перегрузкой оператора >>. Подробнее написано практически в любой книжке по C++.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Январь 30, 2009, 08:35 »

2 AntonUfo, почитай про контейнеры и работу с ними, тут есть перевод
Записан

Юра.
BaltikS
Гость
« Ответ #5 : Январь 30, 2009, 09:24 »

Примерно так...

Код
C++ (Qt)
QList<QGraphicsItem *> items () const
 
QFile file("file.dat");
file.open(QIODevice::WriteOnly);
QDataStream out(&file);
 
 
foreach(QGraphicsItem *item, scene->items())
{
   MyGraphicsItem *myitem= qgraphicsitem_cast<MyGraphicsItem>(item);
   if (myitem)
  {
      out<<(qint32)myitem->Number;
      out<<myitem->name;
  }
}
 
« Последнее редактирование: Февраль 03, 2009, 15:04 от BaltikS » Записан
AntonUfo
Гость
« Ответ #6 : Февраль 03, 2009, 13:14 »

Примерно так...


Спасибо огромное ! теперь другая проблема появилась, дело в том что на сцену я выкидываю мой класс образованный от QGraphicsItem и мой второй класс образованный от QGraphicsLineItem, если рисовать только фигуры отрисованные с помощью QGraphicsItem то все сохраняется, а если на сцене рисовать еще и с помощью QGraphicsLineItem то функция сохранения виснет... Грустный , в чем может быть проблема ?

Спасибо !!!


class Node : public QGraphicsItem
class Link :  public QGraphicsLinkItem

проблема в том что вот такой код работает нормально (просматривается список и если "линия" то выводим в файл):

Код:
foreach(QGraphicsItem *item, scene->items())
{
    Link *myitem = qgraphicsitem_cast<Link>(item);
    if (myitem)
   {
     
       out<<myitem->myText;
   }
}


а вот такой код НЕ работает (должен работать так, просматривается список и если "узел" то выводим в файл):

Код:
foreach(QGraphicsItem *item, scene->items())
{
    Node *myitem = qgraphicsitem_cast<Node>(item);
    if (myitem)
   {
       out<<myitem->myText;
   }
}
программа виснет когда при просмотре списка натыкается на Link и пытается прочитать значение myitem->myText;

как это исправить !?
« Последнее редактирование: Февраль 03, 2009, 13:53 от AntonUfo » Записан
Rcus
Гость
« Ответ #7 : Февраль 03, 2009, 14:05 »

Читать доки по qgraphicsitem_cast (иначе qgraphicsitem_cast не отличается от static_cast)
Записан
BaltikS
Гость
« Ответ #8 : Февраль 03, 2009, 15:09 »

Типа этого надо написать при создании нового потомка...  (взято из ассистента).... Как написал  Rcus  внимательно изучаем документацию.. Веселый
Код
C++ (Qt)
class CustomItem : public QGraphicsItem
{
   ...
   enum { Type = UserType + 1 };
 
   int type() const
   {
       // Enable the use of qgraphicsitem_cast with this item.
       return Type;
   }
   ...
};
 
Записан
AntonUfo
Гость
« Ответ #9 : Февраль 03, 2009, 15:36 »

Спасибо ! Заработало!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.085 секунд. Запросов: 22.