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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Размещение QGraphicsItem'ов на QGraphicsScene - проблемы.  (Прочитано 7549 раз)
FlexoID
Гость
« : Июнь 09, 2009, 16:08 »

Итак, есть QGraphicsView (выступает в роли главного окна)/QGraphicsScene и QGraphicsItem (вообще их много будет). Немогу нормально разместить последних на сцене. Сто раз перечитал в хелпе по поводу преобразования координат и всего прочего, так что просто туда не посылайте. Вобщем, в качестве фона QGraphicsScene у меня QPixmap. Окно должно быть по размеру равно картинке, поэтому делаю так:
Код:
view->resize(bgpixmap.size());
scene->setSceneRect(QVariant(bgpixmap.rect()).toRectF());
И кароче так получается, что если делать Item'у setPos(0,0) то он получается хрен знает где, но только не по центру.

Что мне можете тут посоветовать? Как правильно сделать View с Scene'ой фиксированного размера, и чтобы нормально можно было размещать на ней Item'ы? Может есть другие, более правильные способы?
Еще было бы неплохо иметь возможность задавать координаты Item'ов с таким расчетом, что (0,0) - левый верхний урол. Для меня так привычнее, удабнее и нагляднее как-то. Делал конструкции из нескольких mapTo*** - нужного результата так и не добился.
Зараннее благодарю.
Записан
BaltikS
Гость
« Ответ #1 : Июнь 09, 2009, 19:31 »

По моим наблюдениям:
1) размер сцены зафиксировать нельзя. Она автоматом расширяется если итем находится вне размеров сцены.
2) по центру можно выровнять у QGraphicsView::centerOn(item)

Я бы сделал в вашем случае по другому...
1) Зафиксировал бы размер View
2) Создал бы QGraphicsPixmapItem(с непермещаемым флагом) и поместил бы его по центру.
3) Все итемы уже создавал бы уже на этом пиксмапитеме создавал остальные элементы...
Записан
mal
Гость
« Ответ #2 : Июнь 09, 2009, 20:51 »

не могу до конца вкурить, что тебе надо, потому как понял:
фоном на  сцене использую картинку ,  после создания сцены, кидаю на нее пустой пиксмап:
Код:
QPixmapItem *pxm_item; // объявлена где то в h-файле
...
// в функции создания сцены
QPixmap background;
scene->setSceneRect(0, 0, 200,200);
background.fill(Qt::gray);
pxm_item = scene->addPixmap( background );

далее, когда гружу на сцену реальную картинку по команде  делаю предположим так:
Код:
void slot_set_img(QImage *img)
{
   pxm_item->resetTransform();
   pxm_item->show();
   pxm_item->setPixmap(QPixmap::fromImage(img));
   scene->setSceneRect(0, 0, img.width(), img.height());
}
картинка лежит фоном на сцене, ее точка (0,0) совпадает с координатой (0,0)  сцены.

а дальше, когда какие либо еще айтемы добавляются на сцену - они добавляются туда, куда им указано при создании либо функцией айтема setPos.
ЗЫ или я чего то не понимаю в сути вопроса.
Записан
FlexoID
Гость
« Ответ #3 : Июнь 09, 2009, 21:33 »

Вообще я отрисовывал фон, переопределяя drawBackground в Scene, и видно картинка располагалась не по центру, а как ей хотелось. Сейчас буду пробовать делать фон как Item. Сасибо, отпишу, если получится.
Записан
FlexoID
Гость
« Ответ #4 : Июнь 09, 2009, 22:21 »

При таком раскладе получилось, что точка (0,0) находиться почти в левом верхнем углу фоновой картинки, т.е. она расположилась не по центру. Опять какие-то непонятки получаются...
Записан
Icoz
Гость
« Ответ #5 : Июль 21, 2009, 09:24 »

У меня схожая проблема, но с одним ньюансом: у меня используются qgraphicslayout.
делаю так:
1) создаю view, делаю resize(320,240); (пишу для кпк)
2) создаю QGraphicsGridLayout, размещаю все на нем.
3) создаю form как qgraphicswidget, делаю form->setLayout(grid_layout);
4) scene->additem(form);
5) view->fitInView(form);

В результате, форма получается уже, чем окно и больше по высоте. Примерно 250 на 250 пиксел.
Пробовал centerOn - почти та же фигня.
Как мне заставить form быть такой же как view?
« Последнее редактирование: Июль 21, 2009, 16:14 от Icoz » Записан
Icoz
Гость
« Ответ #6 : Июль 21, 2009, 16:13 »

Вроде бы нашел решение.
Код:
view->resize(320,240);
scene->setSceneRect(0,0,320,240);
/* form = QGraphicsWidget */
form->setGeometry(0,0,320,240);

PS. При этом не помешает
Код:
view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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