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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Нужно объединить несколько картинок в одну и двигать по сцене.  (Прочитано 9758 раз)
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));
....
Дело весьма утомительное, особенно если всё это дело нужно двигать как одно целое и картинок множество.
Может кто то подскажет как можно упростить данное решение?
Записан
Kolobok
Гость
« Ответ #1 : Декабрь 21, 2010, 11:43 »

Задай айтемам одного родителя и двигай его.
Записан
Jkc
Гость
« Ответ #2 : Декабрь 21, 2010, 19:32 »

Задай айтемам одного родителя и двигай его.
А можно пример?
Записан
ufna
Гость
« Ответ #3 : Декабрь 21, 2010, 19:48 »

Код:
QGraphicsSceneItem *item = new QGraphicsSceneItem(&scene);

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

Что-то в таком духе.
Записан
Jkc
Гость
« Ответ #4 : Декабрь 22, 2010, 11:36 »

Код:
QGraphicsSceneItem *item = new QGraphicsSceneItem(&scene);

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

Что-то в таком духе.
Спасибо конечно, хотя понятно что нечего не понятно, облазил весь форум но так и не нашел
как разместить картинки на QGraphicsPixmapItmem . Где прописывать координаты каждой картинки?
Может я не понятно выразился.
Мне нужно все картинки расставить в заданном порядке на что то, а потом это что то двигать по сцене
изменять размер и т.п.
« Последнее редактирование: Декабрь 22, 2010, 11:38 от Jkc » Записан
Jkc
Гость
« Ответ #5 : Декабрь 22, 2010, 14:41 »

Ну что, так не кто и не поможет?
Я думал это тривиальная задача,
в любом случае всем спасибо. Буду двигать каждую по отдельности.
Записан
Kolobok
Гость
« Ответ #6 : Декабрь 22, 2010, 16:36 »

Это тривиальная задача. Тебе и сказали, и показали, как это сделать.
Записан
Jkc
Гость
« Ответ #7 : Декабрь 22, 2010, 17:53 »

Это тривиальная задача. Тебе и сказали, и показали, как это сделать.
Ответ в стиле
-Как пройти на такую улицу.
-Идите на север.
Записан
Kolobok
Гость
« Ответ #8 : Декабрь 22, 2010, 18:14 »

Это тривиальная задача. Тебе и сказали, и показали, как это сделать.
Ответ в стиле
-Как пройти на такую улицу.
-Идите на север.

Это не ответ. Ответ был выше. Попробуй прочитать его еще раз. Или обьясни, что конкретно ты не понял.
Записан
Jkc
Гость
« Ответ #9 : Декабрь 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. как и куда прописывать координаты картинок?
Записан
Kolobok
Гость
« Ответ #10 : Декабрь 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

Судя по твоим координатам, картинки изменяют положение относительно друг друга. Тогда этот способ не пойдет.
Записан
ufna
Гость
« Ответ #11 : Декабрь 22, 2010, 23:00 »

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

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

QGraphicsSceneItem - это очепятка, т.к. писал по памяти а не смотрел в документацию, но общий смысл там по-моему предельно ясен. Никто не мешает зайти в доки и почитать про системы координат и иерархию айтемов на сцене, где все разжевано.
Записан
Jkc
Гость
« Ответ #12 : Декабрь 22, 2010, 23:46 »

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

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

QGraphicsSceneItem - это очепятка, т.к. писал по памяти а не смотрел в документацию, но общий смысл там по-моему предельно ясен. Никто не мешает зайти в доки и почитать про системы координат и иерархию айтемов на сцене, где все разжевано.
Большое спасибо за оказанную помощь.
Я и минуты не сомневался, что и QGraphicsSceneItem и QGraphicsPixmapI(t)mem опечатки.
Насчёт документации , так давайте читать одну документацию где всё расписано, зачем нам эти форумы.
Записан
ufna
Гость
« Ответ #13 : Декабрь 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.

Я не думаю что многим здесь доставляет удовольствие пояснять вопросы, которые в доках написаны очень подробно. Особенно когда ответ был дан на задачу сразу же.
Записан
Jkc
Гость
« Ответ #14 : Декабрь 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)); // а вот так нет
Не хочет группа картинок слушаться стейта.



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


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