Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: AntonUfo от Январь 29, 2009, 14:55



Название: Как сохранить QGraphicsItemы выведенные на QGraphicsScene в файл?
Отправлено: 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();
}


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

Спасибо!




Название: Re: Как сохранить QGraphicsItemы выведенные на QGraphicsScene в файл?
Отправлено: Rcus от Январь 29, 2009, 15:38
1. Возможно не понял вопроса, но foreach?
2. это уже зависит от ваших пожеланий, например сохранять позицию, трансформацию, вложенный список подчиненных и т.д.... Но помоему проще будет сохранить информацию на основе которой они были созданы.


Название: Re: Как сохранить QGraphicsItemы выведенные на QGraphicsScene в файл?
Отправлено: AntonUfo от Январь 29, 2009, 16:49
Так в том то и дело что я незнаю как !!!

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

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

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


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

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



Название: Re: Как сохранить QGraphicsItemы выведенные на QGraphicsScene в файл?
Отправлено: Swappp от Январь 29, 2009, 22:15
Так это вроде элементарные вещи... И кстати к 2D и 3D графики отношения не имеют :)
Можно например перегрузить оператор << у класса унаследованного от QGraphicItem. В итоге получится что то вроде того:
Код:
foreach(o, list)
{
  file<<o;
}
а в самом методе operator<< соответственно писать нужные параметры в файл (поток). Чтение потом можно реализовать например перегрузкой оператора >>. Подробнее написано практически в любой книжке по C++.


Название: Re: Как сохранить QGraphicsItemы выведенные на QGraphicsScene в файл?
Отправлено: lit-uriy от Январь 30, 2009, 08:35
2 AntonUfo, почитай про контейнеры и работу с ними, тут есть перевод (http://doc.crossplatform.ru/qt/4.3.5/containers.html)


Название: Re: Как сохранить QGraphicsItemы выведенные на QGraphicsScene в файл?
Отправлено: BaltikS от Январь 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;
  }
}
 


Название: Re: Как сохранить QGraphicsItemы выведенные на QGraphicsScene в файл?
Отправлено: AntonUfo от Февраль 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;

как это исправить !?


Название: Re: Как сохранить QGraphicsItemы выведенные на QGraphicsScene в файл?
Отправлено: Rcus от Февраль 03, 2009, 14:05
Читать доки по qgraphicsitem_cast (иначе qgraphicsitem_cast не отличается от static_cast)


Название: Re: Как сохранить QGraphicsItemы выведенные на QGraphicsScene в файл?
Отправлено: BaltikS от Февраль 03, 2009, 15:09
Типа этого надо написать при создании нового потомка...  (взято из ассистента).... Как написал  Rcus  внимательно изучаем документацию.. :D
Код
C++ (Qt)
class CustomItem : public QGraphicsItem
{
   ...
   enum { Type = UserType + 1 };
 
   int type() const
   {
       // Enable the use of qgraphicsitem_cast with this item.
       return Type;
   }
   ...
};
 


Название: Re: Как сохранить QGraphicsItemы выведенные на QGraphicsScene в файл?
Отправлено: AntonUfo от Февраль 03, 2009, 15:36
Спасибо ! Заработало!