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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QGraphicsItem(QPainterPath) неправильно определяется boundingRect  (Прочитано 3162 раз)
Nidxogg
Гость
« : Февраль 16, 2014, 01:24 »

Добрый день, возникла следующая проблема:
Имеется класс, унаследованный от QGraphicsItem, в котором рисую ломанную стрелку(от А к B) с использованием QPainterPath
Код:
    this->setPos(A->scenePos());//A - указатель на 1 элемент B - на второй
    QPointF p0 = A->boundingRect().topRight()+QPointF(0,10);
    QPainterPath path(p0);//Начало PainterPath
    int dy = B->pos().y()-A->pos().y();
    int dx = B->pos().x()-(A->pos().x()+A->boundingRect().topRight().x());
    //В зависимости от dx и dy линия рисуется по разному
    if((dx>=0)&&(dy>0))
    {
        QPointF p1(p0+QPointF(dx,0));//Линия вправо
        path.lineTo(p1);
        QPainterPath path2(p1);
        QPointF p2(p1+QPointF(0,dy-10));//Линия вниз
        path2.lineTo(p2);
        path |=path2;
        QPolygonF polygon;
        polygon << QPoint( p2.x()-3, p2.y()-10 );
        polygon << p2;
        polygon << QPoint( p2.x()+3, p2.y()-10 );
        QPainterPath path3;
        path3.addPolygon(polygon);
        path.addPath(path3);// Стрелка
}
...//Остальные варианты
currentPath = path;
painter->drawPath(currentPath);
Переопределены
Код:
QPainterPath LinkItem::shape() const
{
    return currentPath;
}

QRectF LinkItem::boundingRect() const
{
    return shape().boundingRect();
}

Унаследовался от класса сцены и переопределил mouse евенты.
Код:
void WorkScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
...//Обработка мыши
  QGraphicsScene::mousePressEvent(event);
}

Собственно, в mousepress есть строчка

itemAt(event->scenePos()), возвращает 0 - если нет итемов на сцене

Щелкая по стрелке, данная функция всегда возвращает 0, кроме случая, когда щелкаю по самой стрелке (Polygon который в painter)

С обычными стандратными итемами(прямоугольник, круг и т.д) таким проблем нет

Может кто сталкивался с подобной проблемой?

P.S В классе стрелки корректно обрабатываются  hoverEnterEvent и hoverLeaveEvent и т.д
Код:
void LinkItem::hoverEnterEvent(QGraphicsSceneHoverEvent *)
{
    this->setCursor(Qt::PointingHandCursor);
    this->setZValue(1);
    this->pen.setColor(Qt::white);
}

Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Февраль 16, 2014, 11:27 »

что то я не понял, а где вы рисуете стрелку - в паинте сцены? судя по тому что используете координаты сцены, позиции элемента, то да. Не проще ли стрелку рисовать в самом элементе?
Вот мой код стрелки на сцене. Он старый но рабочий. Думаю разберетесь. С минимальными правками можете добавить к себе в проект и посомотреть как работает.
Записан
Nidxogg
Гость
« Ответ #2 : Февраль 16, 2014, 14:55 »

Цитировать
что то я не понял, а где вы рисуете стрелку - в паинте сцены? судя по тому что используете координаты сцены, позиции элемента, то да. Не проще ли стрелку рисовать в самом элементе?
В paintEvent унаследованного от QGraphicsItem класса
Без установки setPos не обрабатываются hoverэвенты. В самом пэйнтэвенте в координатам итема рисую же.

Ваш класс гляну при первой возможности, спасибо.



P.S Подозреваю, что проблема, в том как соединяются части в QPainterPath
« Последнее редактирование: Февраль 16, 2014, 15:15 от Nidxogg » Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #3 : Февраль 17, 2014, 11:00 »

Правильные подозрения, я с таким лично сталкивался, вам нужно смотреть в сторону QPainterPath transform/united
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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