Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Nidxogg от Февраль 16, 2014, 01:24



Название: QGraphicsItem(QPainterPath) неправильно определяется boundingRect
Отправлено: 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);
}



Название: Re: QGraphicsItem(QPainterPath) неправильно определяется boundingRect
Отправлено: Fregloin от Февраль 16, 2014, 11:27
что то я не понял, а где вы рисуете стрелку - в паинте сцены? судя по тому что используете координаты сцены, позиции элемента, то да. Не проще ли стрелку рисовать в самом элементе?
Вот мой код стрелки на сцене. Он старый но рабочий. Думаю разберетесь. С минимальными правками можете добавить к себе в проект и посомотреть как работает.


Название: Re: QGraphicsItem(QPainterPath) неправильно определяется boundingRect
Отправлено: Nidxogg от Февраль 16, 2014, 14:55
Цитировать
что то я не понял, а где вы рисуете стрелку - в паинте сцены? судя по тому что используете координаты сцены, позиции элемента, то да. Не проще ли стрелку рисовать в самом элементе?
В paintEvent унаследованного от QGraphicsItem класса
Без установки setPos не обрабатываются hoverэвенты. В самом пэйнтэвенте в координатам итема рисую же.

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



P.S Подозреваю, что проблема, в том как соединяются части в QPainterPath


Название: Re: QGraphicsItem(QPainterPath) неправильно определяется boundingRect
Отправлено: Fregloin от Февраль 17, 2014, 11:00
Правильные подозрения, я с таким лично сталкивался, вам нужно смотреть в сторону QPainterPath transform/united