Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Jkc от Декабрь 21, 2010, 11:20



Название: Нужно объединить несколько картинок в одну и двигать по сцене.
Отправлено: Jkc от Декабрь 21, 2010, 11:20
Есть несколько картинок, их нужно объединить в одну, так что бы они следовали дна за другой
и получилась одна длинная картинка,
положить это дело на сцену где можно было бы крутить - вертеть эту картинку ,
сцену привязать к QGraphicsView а QGraphicsView установить на Layout где можно
менять пропорционально размеры.
В настоящий момент я выкладываю на сцену все картинки по отдельности, как в примере states.
Код:
  Pixmap *p1 = new Pixmap(QPixmap(":/digikam.png"));
  Pixmap *p2 = new Pixmap(QPixmap(":/akregator.png"));
.....
QGraphicsScene scene(0, 0, 400, 300);
    scene.setBackgroundBrush(scene.palette().window());
    scene.addItem(p1);
    scene.addItem(p2);
....
 QStateMachine machine;
    QState *state1 = new QState(&machine);
    QState *state2 = new QState(&machine);
    machine.setInitialState(state1);
....
state1->assignProperty(p1, "pos", QPointF(68, 185));
    state1->assignProperty(p2, "pos", QPointF(168, 185));
    state1->assignProperty(p3, "pos", QPointF(268, 185));
....
Дело весьма утомительное, особенно если всё это дело нужно двигать как одно целое и картинок множество.
Может кто то подскажет как можно упростить данное решение?


Название: Re: Нужно объединить несколько картинок в одну и двигать по сцене.
Отправлено: Kolobok от Декабрь 21, 2010, 11:43
Задай айтемам одного родителя и двигай его.


Название: Re: Нужно объединить несколько картинок в одну и двигать по сцене.
Отправлено: Jkc от Декабрь 21, 2010, 19:32
Задай айтемам одного родителя и двигай его.
А можно пример?


Название: Re: Нужно объединить несколько картинок в одну и двигать по сцене.
Отправлено: ufna от Декабрь 21, 2010, 19:48
Код:
QGraphicsSceneItem *item = new QGraphicsSceneItem(&scene);

scene.AddItem(new QGraphicsPixmapImem(item, "img1.png"));
scene.AddItem(new QGraphicsPixmapImem(item, "img2.png"));

Что-то в таком духе.


Название: Re: Нужно объединить несколько картинок в одну и двигать по сцене.
Отправлено: Jkc от Декабрь 22, 2010, 11:36
Код:
QGraphicsSceneItem *item = new QGraphicsSceneItem(&scene);

scene.AddItem(new QGraphicsPixmapImem(item, "img1.png"));
scene.AddItem(new QGraphicsPixmapImem(item, "img2.png"));

Что-то в таком духе.
Спасибо конечно, хотя понятно что нечего не понятно, облазил весь форум но так и не нашел
как разместить картинки на QGraphicsPixmapItmem . Где прописывать координаты каждой картинки?
Может я не понятно выразился.
Мне нужно все картинки расставить в заданном порядке на что то, а потом это что то двигать по сцене
изменять размер и т.п.


Название: Re: Нужно объединить несколько картинок в одну и двигать по сцене.
Отправлено: Jkc от Декабрь 22, 2010, 14:41
Ну что, так не кто и не поможет?
Я думал это тривиальная задача,
в любом случае всем спасибо. Буду двигать каждую по отдельности.


Название: Re: Нужно объединить несколько картинок в одну и двигать по сцене.
Отправлено: Kolobok от Декабрь 22, 2010, 16:36
Это тривиальная задача. Тебе и сказали, и показали, как это сделать.


Название: Re: Нужно объединить несколько картинок в одну и двигать по сцене.
Отправлено: Jkc от Декабрь 22, 2010, 17:53
Это тривиальная задача. Тебе и сказали, и показали, как это сделать.
Ответ в стиле
-Как пройти на такую улицу.
-Идите на север.


Название: Re: Нужно объединить несколько картинок в одну и двигать по сцене.
Отправлено: Kolobok от Декабрь 22, 2010, 18:14
Это тривиальная задача. Тебе и сказали, и показали, как это сделать.
Ответ в стиле
-Как пройти на такую улицу.
-Идите на север.

Это не ответ. Ответ был выше. Попробуй прочитать его еще раз. Или обьясни, что конкретно ты не понял.


Название: Re: Нужно объединить несколько картинок в одну и двигать по сцене.
Отправлено: Jkc от Декабрь 22, 2010, 19:10
Это тривиальная задача. Тебе и сказали, и показали, как это сделать.
Ответ в стиле
-Как пройти на такую улицу.
-Идите на север.

Это не ответ. Ответ был выше. Попробуй прочитать его еще раз. Или обьясни, что конкретно ты не понял.

В общем как я писал в первом посте есть
 пиксмапы, есть сцена , куда я  добавляю пиксмапы,
есть  QStateMachine
    QStateMachine machine;
    QState *state1 = new QState(&machine);
    QState *state2 = new QState(&machine);
    machine.setInitialState(state1);

тут я могу установить КАЖДУЮ картинку в нужное мне место.

    state1->assignProperty(p1, "pos", QPointF(68, 185));
    state1->assignProperty(p2, "pos", QPointF(168, 185));
меняя активный state1 на state2 я меняю расположение своих картинок
    state2->assignProperty(p1, "pos", QPointF(100, 225));
    state2->assignProperty(p2, "pos", QPointF(198, 235));
--
тут мне всё понятно и я бы не искал ответ если бы картинок было не 50.
----------------------------------------------------------------------------------------------------
По вашим ответам

QGraphicsSceneItem *item = new QGraphicsSceneItem(&scene);

scene.AddItem(new QGraphicsPixmapImem(item, "img1.png"));
scene.AddItem(new QGraphicsPixmapImem(item, "img2.png"));

Я так понял что должен быть некий айтем типа
QGraphicsSceneItem *item = new QGraphicsSceneItem(&scene);
далее в нем я размещаю свои картинки типа так

item->assignProperty(p1, "pos", QPointF(0, 60));
item->assignProperty(p2, "pos", QPointF(60, 60));  ....

далее я этот айтем устанавливаю в стейты на разные позиции и меняю позиции изменяя активный стейт.
    state1->assignProperty(item, "pos", QPointF(68, 185));
    state2->assignProperty(item, "pos", QPointF(268, 285));
---
НО
1. неизвестный зверь QGraphicsSceneItem (у меня его так точно нет qt4,7,1)
2. как и куда прописывать координаты картинок?


Название: Re: Нужно объединить несколько картинок в одну и двигать по сцене.
Отправлено: Kolobok от Декабрь 22, 2010, 20:15
1. Это ufna опечатался. Если посмотреть на конструктор QGraphicsPixmapItem, то становится понятно, что это должен быть QGraphicsItem. В твоем случае лучше всего взять QGraphicsItemGroup.

2. Позиции картинок выставляются один раз.

Код:
QList<QGraphicsItem *> items;

QGraphicsPixmapItem *item1 = new QGraphicsPixmapItem( QPixmap("img1.png"), group );
item1->setPos(0,60);
scene->addItem( item1 );
items << item1;
...

QGraphicsItemGroup *group =  scene->createItemGroup ( items );

//Дальше в QStateMachine задаешь координаты только group

Судя по твоим координатам, картинки изменяют положение относительно друг друга. Тогда этот способ не пойдет.


Название: Re: Нужно объединить несколько картинок в одну и двигать по сцене.
Отправлено: ufna от Декабрь 22, 2010, 23:00
Jkc, для Qt есть замечательная штука - это документация, которая позволяет решить 99% возникающих вопросов, и уж тем более содержит ответы для решения данного.

Если вам нужно двигать несколько айтемов как один - назначьте им общего родителя, и двигайте его, и в то же время никто не запретит изменить координаты айтемов по отдельности.

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


Название: Re: Нужно объединить несколько картинок в одну и двигать по сцене.
Отправлено: Jkc от Декабрь 22, 2010, 23:46
Jkc, для Qt есть замечательная штука - это документация, которая позволяет решить 99% возникающих вопросов, и уж тем более содержит ответы для решения данного.

Если вам нужно двигать несколько айтемов как один - назначьте им общего родителя, и двигайте его, и в то же время никто не запретит изменить координаты айтемов по отдельности.

QGraphicsSceneItem - это очепятка, т.к. писал по памяти а не смотрел в документацию, но общий смысл там по-моему предельно ясен. Никто не мешает зайти в доки и почитать про системы координат и иерархию айтемов на сцене, где все разжевано.
Большое спасибо за оказанную помощь.
Я и минуты не сомневался, что и QGraphicsSceneItem и QGraphicsPixmapI(t)mem опечатки.
Насчёт документации , так давайте читать одну документацию где всё расписано, зачем нам эти форумы.


Название: Re: Нужно объединить несколько картинок в одну и двигать по сцене.
Отправлено: ufna от Декабрь 22, 2010, 23:52
Знаете, я бы понял если бы речь шла о документации к примеру FFMpeg, но кутэшные доки не читать - это как то моветон.

Самый простой QGraphicsItem (а это основа этого модуля, по-моему очевидно в начале заглянуть туда), там цитата:

Цитировать
Items can contain other items, and also be contained by other items. All items can have a parent item and a list of children. Unless the item has no parent, its position is in parent coordinates (i.e., the parent's local coordinates). Parent items propagate both their position and their transformation to all children.

Я не думаю что многим здесь доставляет удовольствие пояснять вопросы, которые в доках написаны очень подробно. Особенно когда ответ был дан на задачу сразу же.


Название: Re: Нужно объединить несколько картинок в одну и двигать по сцене.
Отправлено: Jkc от Декабрь 25, 2010, 18:49
В общем получилось все пиксмапы выстроить в цепочку   но не выходит добавить в QStateMachine.
Устанавливаю в QState а толку нет.
Пробовал разные способы
Цитировать
делал так
GraphicsItemGroup : public QObject , public  QGraphicsItemGroup
....
GraphicsItemGroup *   group  = new GraphicsItemGroup()
group-addToGroup(item1);  .....2.. 3
.........................................
или так
GraphicsItemGroup : public QObject , public  QGraphicsItem
item1->setParentItem(group);
........
scene->addItem(group);

group->setPos(350, 100);   // таким способом изменять положение всей группы картинок выходит

QStateMachine *machine = new QStateMachine(scene);
QState *state1 = new QState(machine);
QState *state2 = new QState(machine);
machine->setInitialState(state1);
state1->assignProperty(group,    "pos",  QPointF(350, 105)); // а вот так нет
Не хочет группа картинок слушаться стейта.





Название: Re: Нужно объединить несколько картинок в одну и двигать по сцене.
Отправлено: Kolobok от Декабрь 25, 2010, 18:53
Определи Q_PROPERTY для pos.


Название: Re: Нужно объединить несколько картинок в одну и двигать по сцене.
Отправлено: Jkc от Декабрь 25, 2010, 20:15
Определи Q_PROPERTY для pos.
Сейчас буду читать про Q_PROPERTY но только одно уточнение, другие пиксмапы и виджеты
перемещаются без проблем


Название: Re: Нужно объединить несколько картинок в одну и двигать по сцене.
Отправлено: Jkc от Декабрь 25, 2010, 20:33
Всё, большое спасибо всем, все заработало.
Наверное напишу небольшой пример по теме.