Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: AntonUfo от Февраль 06, 2009, 12:26



Название: Как нарисовать линию со стрелкой используя QGraphicsLineItem ?
Отправлено: AntonUfo от Февраль 06, 2009, 12:26
Собственно вопрос, в том что с тем как рисовать просто линию я вроде бы как понял, а как нарисовать линию со стрелкой или с квадратиком на конце (в середине), может быть у кого нибудь есть примерчик ? (линию рисую наследуя QGraphicsLineItem)

Спасибо !

PS: пример Diagramscene смотрел, только разобраться как в нем линия со стрелкой не смог :(

2PS: Предполагаю что нужно делать с помощью переопределения метода QGraphicsItem:

virtual void paint (QPainter* painter, const QStyleOptionGraphicsItem *option, QWidget * widget = 0 );

только как ?


Название: Re: Как нарисовать линию со стрелкой используя QGraphicsLineItem ?
Отправлено: lit-uriy от Февраль 06, 2009, 17:09
см. пример $(QTDIR)\examples\graphicsview\diagramscene


Название: Re: Как нарисовать линию со стрелкой используя QGraphicsLineItem ?
Отправлено: AntonUfo от Февраль 07, 2009, 17:12
Да, я смотрел ии этот пример то же, только у меня такая проблема, после того как я определил:
Код:

void Link::paint(QPainter *painter,
                 const QStyleOptionGraphicsItem *option,
                 QWidget * /* widget */)
{

    if (myFromNode->collidesWithItem(myToNode))
        return;

    arrowHead.clear();
    painter->setRenderHint(QPainter::Antialiasing, true);


    double angle = ::acos(line().dx() / line().length());

    if (line().dy() >= 0)
        angle = (Pi * 2) - angle;

        QPointF arrowP1 = line().p1() + QPointF(sin(angle + Pi / 3) * arrowSize,
                                        cos(angle + Pi / 3) * arrowSize);
        QPointF arrowP2 = line().p1() + QPointF(sin(angle + Pi - Pi / 3) * arrowSize,
                                        cos(angle + Pi - Pi / 3) * arrowSize);


        arrowHead << line().p1() << arrowP1 << arrowP2;

        //painter->drawLine(line());
        painter->drawPolygon(arrowHead);


у меня стрелка рисуется, вот только после того как я ее по экрану двигать начинаю на сцене появляются артефакты, см. вложение..

Как от них избавится ?

И еще обьясните для чего и как используется функция
Код:
QRectF MyClass::boundingRect() const
{


}



Название: Re: Как нарисовать линию со стрелкой используя QGraphicsLineItem ?
Отправлено: BaltikS от Февраль 07, 2009, 19:20
QRectF MyClass::boundingRect() const - это размер прямоугольной области, который отрисовывает сцена у итема. Если её не задавать, то отрисовка происходить не будет. Артефакты как раз таки и связаны с тем, что неправильно определена скорее всего данная область


Название: Re: Как нарисовать линию со стрелкой используя QGraphicsLineItem ?
Отправлено: AntonUfo от Февраль 10, 2009, 23:52
И еще вопрос, почему то если вот эту функцию:
Код:
Node *Window::selectedNode() const
{
    QList<QGraphicsItem *> items = scene->selectedItems();
    if (items.count() == 1) {
        return dynamic_cast<Node *>(items.first());
    } else {
        return 0;
    }
}
использовать без const, при выборе узла на сцене выскакивает ошибка, что значит параметр const ?
PS: в общих чертах понятно что эта функция делает, пытаюсь понять пример из книги, а в ней объяснения никакого по этому поводу...  :(


Название: Re: Как нарисовать линию со стрелкой используя QGraphicsLineItem ?
Отправлено: BRE от Февраль 11, 2009, 00:32
PS: в общих чертах понятно что эта функция делает, пытаюсь понять пример из книги, а в ней объяснения никакого по этому поводу...  :(
Ты это найдешь в книге по C++, ее желательно прочитать перед изучением Qt.  ;)