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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Нужна помощь QGraphicsView/QGraphicsScene QGraphicsPixmapItem  (Прочитано 7003 раз)
notnext
Гость
« : Апрель 17, 2009, 15:11 »

Всем здрасти.
Возникла такая вот потребность:

GraphWidget унаследован от QGraphicsView.
На сцену добавляется произвольный полигон(QGraphicsPolygonItem*) в произвольное место. Его родителем является  QGraphicsPixmapItem*.

По двойному клику на полигоне необходимо получить новый Pixmap из участка родительского QGraphicsPixmapItem* выделенного  полигоном.

Вот примерчик кода:

Код
C++ (Qt)
void GraphWidget::mouseDoubleClickEvent( QMouseEvent* event)
{
   QGraphicsItem *item = scene()->itemAt(event->posF());
   if (item->type() == QGraphicsPolygonItem::Type){
       QGraphicsPolygonItem *gPol = (QGraphicsPolygonItem*)item;
       QRegion reg(gPol->polygon().toPolygon());
 
       QPixmap *sPixmap = new QPixmap(reg.boundingRect().width(), reg.boundingRect().height() );
       sPixmap->fill(QColor(0, 0, 0, 0));
 
       QPainter painter(sPixmap);
       painter.setRenderHint(QPainter::Antialiasing);
       painter.save();
       painter.setClipRegion(reg);
 
       if(item->parentItem()->type() == QGraphicsPixmapItem::Type) {
           QGraphicsPixmapItem *gPix = (QGraphicsPixmapItem*)item->parentItem();
           painter.drawPixmap(reg.boundingRect().x(), reg.boundingRect().y(), gPix->pixmap());
       }
 
       painter.restore();
       painter.end();
 
       sPixmap->save("test_"+QTime::currentTime().toString()+".png");
   }
 
   QGraphicsView::mouseDoubleClickEvent(event);
}

НО У МЕНЯ НИЧЕГО НЕ ВЫШЛО!!!
Я так понимаю что-то с координатами напортачил. Но голова уже не пашет. А кусочек этот сегодня желательно поправить.
Всем принявшим участие заранее большое спасибо.
« Последнее редактирование: Апрель 17, 2009, 16:16 от pastor » Записан
Rcus
Гость
« Ответ #1 : Апрель 17, 2009, 15:41 »

Если уж полигон, то лучше использовать не boundingRect(), а shape().
Обе функции возвращают объекты в координатах item'а, нужна преобразовать к координатам родителя mapToParent(..)
Записан
notnext
Гость
« Ответ #2 : Апрель 20, 2009, 09:54 »

Если уж полигон, то лучше использовать не boundingRect(), а shape().
Обе функции возвращают объекты в координатах item'а, нужна преобразовать к координатам родителя mapToParent(..)


Если не трудно. Можно примерчик. Заранее признателен.
Записан
Rcus
Гость
« Ответ #3 : Апрель 20, 2009, 10:12 »

/*Слегка раскуривает ман*/
Давайте-ка я сегодня буду писать на псевдокоде Улыбающийся

Создаем изображение размером с прямоугольную границу выделения. Создаем на нем маляра /*laughs*/, и даем задаем ему маску для рисования, созданную из формы выделения
Берем прямоугольник выделения и преобразуем к координатам родителя, а затем даем команду маляру скопировать эту часть родителя на наше изображение.

/*Посмотрел, да это же почти то же что и было в первом посте*/
Записан
notnext
Гость
« Ответ #4 : Апрель 20, 2009, 10:22 »

Rcus большое тебе конечно спасибо. Но у меня проблемка именно с mapToParent.
Я вот именно этот кусоче и не пому. Непонимающий
Если не сложно обьясни по  подробнее. Поэтому и просил пример.... Улыбающийся
Записан
Rcus
Гость
« Ответ #5 : Апрель 20, 2009, 11:12 »

http://doc.trolltech.com/4.5/graphicsview.html#the-graphics-view-coordinate-system
Записан
notnext
Гость
« Ответ #6 : Апрель 20, 2009, 12:01 »

Вот работающий код. Может кому понадобиться.

Код
C++ (Qt)
void GraphWidget::mouseDoubleClickEvent( QMouseEvent* event)
{
   QPointF ePoint = this->mapToScene(event->pos());
 
   QGraphicsItem *item = scene()->itemAt(ePoint);
   if((item != NULL)&&(item->type() == QGraphicsPolygonItem::Type)){
       qDebug()<<"Find Item. Begin work";
       QGraphicsPolygonItem *gPol = (QGraphicsPolygonItem*)item;
       QRegion reg;
       reg = QRegion(gPol->mapToParent(gPol->polygon()).toPolygon());
 
       QPixmap *sPixmap = new QPixmap(reg.boundingRect().width(), reg.boundingRect().height() );
       sPixmap->fill(QColor(0, 0, 0, 0));
 
       QPainter painter(sPixmap);
       painter.setRenderHint(QPainter::Antialiasing);
       painter.save();
 
       if(item->parentItem()->type() == QGraphicsPixmapItem::Type) {
           QGraphicsPixmapItem *gPix = (QGraphicsPixmapItem*)item->parentItem();
           QPixmap p = gPix->pixmap().copy(reg.boundingRect());
 
           reg.translate(reg.boundingRect().x()*-1, reg.boundingRect().y()*-1);
           painter.setClipRegion(reg);
           painter.drawPixmap(0, 0, p);
           painter.setClipRegion(QRegion());
 
           p.save("tttest_"+QTime::currentTime().toString()+".png");
       }
 
       painter.restore();
       painter.end();
 
       sPixmap->save("test_"+QTime::currentTime().toString()+".png");
   } else {
       qDebug()<<"Not find Item. Not work";
   }
 
   QGraphicsView::mouseDoubleClickEvent(event);
}

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


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