Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: perroBasset от Октябрь 07, 2010, 13:45



Название: Соединение точек отрезками, QGraphicsView
Отправлено: perroBasset от Октябрь 07, 2010, 13:45
Всем добрый день!
Сразу признаюсь, что я чайник, следовательно и вопрос соответствующий.

Есть точки (в массиве std::vector<QPointF>), которые нужно соединить отрезками. Я тыкалась, тыкалась с QGraphicsLineItem, но ничего не выходит..
Очень надеюсь на вашу помощь  :)


Название: Re: Соединение точек отрезками, QGraphicsView
Отправлено: ufna от Октябрь 07, 2010, 14:19
Вопрос - а что вы понимаете под "соединить отрезками"? Вам нужно отрисовать их?


Название: Re: Соединение точек отрезками, QGraphicsView
Отправлено: developer от Октябрь 07, 2010, 14:42
QPolygon, or something like QPolygonGraphicsItem


Название: Re: Соединение точек отрезками, QGraphicsView
Отправлено: perroBasset от Октябрь 07, 2010, 18:46
Да, отрисовать, причем сами сами точки уже отмечены кружками, их осталось только соединить прямыми.


Название: Re: Соединение точек отрезками, QGraphicsView
Отправлено: Mikhail от Октябрь 07, 2010, 18:49
ВОзьмите за основу пример diagramscene.


Название: Re: Соединение точек отрезками, QGraphicsView
Отправлено: Igors от Октябрь 07, 2010, 19:59
Ваша проблема в том что "соединение отрезками точек с кружками" не есть "примитив" который QGraphicsScene может понять. Нужно мыслить "объектно" - это не всегда удобно, но приходится  :)  Первое что приходит в голову - унаследоваться от QGraphicsPolygonItem (пусть он нарисует все отрезки) а потом добавить рисование кружков.


Название: Re: Соединение точек отрезками, QGraphicsView
Отправлено: perroBasset от Октябрь 09, 2010, 14:08
Ребят, посмотрите, пожалуйста, что может быть не так. Решила через QLineF делать.
QVector<QPointF> Points -- это массив точек, которые нужно соединить.

Код:
    scene.clear();
    QPen dashPen;
    dashPen.setStyle(Qt::DashLine);
    for (int i = 0; i < Points.size() - 1; i++)
    {
        QPointF p1, p2;
        QLineF polyLine;
        p1 = Points[i];
        p2 = Points[i+1];
        polyLine = QLineF(p1, p2);

        polyLine->setPen(dashPen);
        scene.addLine(polyLine);
        polyLine = QLineF();
        p1 = QPointF();
        p2 = QPointF();
    }


Название: Re: Соединение точек отрезками, QGraphicsView
Отправлено: Hellraiser от Октябрь 09, 2010, 14:16
Первое, что бросается в глаза - выход за границу массива. Условие выхода из цикла должно быть
Код:
i < Points.size() - 1


Название: Re: Соединение точек отрезками, QGraphicsView
Отправлено: perroBasset от Октябрь 09, 2010, 14:17
Точно, не доглядела, спасибо большое! А в остальном?


Название: Re: Соединение точек отрезками, QGraphicsView
Отправлено: Hellraiser от Октябрь 09, 2010, 14:27
А если вот так:
Код:
for (int i = 0; i < Points.size() - 1; i++)
        scene.addLine(QPointF(Points[i], Points[i+1]), QPen(Qt::DashLine));


Название: Re: Соединение точек отрезками, QGraphicsView
Отправлено: Hellraiser от Октябрь 09, 2010, 14:42
Еще очень смущает сцена (scene), созданная на стеке.


Название: Re: Соединение точек отрезками, QGraphicsView
Отправлено: perroBasset от Октябрь 09, 2010, 15:09
Что это значит?
Кстати, все рисуется, но о-очень криво. На скриншоте справа тестовый график, а слева его врядли узнаешь  ??? (но если все точки на одной прямой, то все ок)
Хотя масштабирование у меня есть.
Код:
void
MainWindow::autoscale()
{
    if (!Points.size())
        return;
    double xmin = Points[0].x(), ymin = Points[0].y();
    double xmax = xmin, ymax = ymin;

    for (unsigned i = 1; i < Points.size(); ++i)
    {
        if (Points[i].x() < xmin) xmin = Points[i].x();
        if (Points[i].x() > xmax) xmax = Points[i].x();
        if (Points[i].y() < ymin) ymin = Points[i].y();
        if (Points[i].y() > ymax) ymax = Points[i].y();
    }
    QRectF rect(QPointF(xmin, ymin), QPointF(xmax, ymax));

    double mx = rect.width() * 0.05;
    double my = rect.height() * 0.05;
    rect.adjust(-mx, -my, mx, my);

    scene.setSceneRect(rect);
    ui.graphicsView->fitInView(rect, Qt::KeepAspectRatio);

    ui.graphicsView->centerOn(rect.center());
}


А если вот так:
Код:
for (int i = 0; i < Points.size() - 1; i++)
        scene.addLine(QPointF(Points[i], Points[i+1]), QPen(Qt::DashLine));
Так гораздо лучше  :) Только Вы, наверное, имели ввиду QLineF.


Название: Re: Соединение точек отрезками, QGraphicsView
Отправлено: Hellraiser от Октябрь 09, 2010, 16:03
Если речь идет о построении графиков и нет ограничений на сторонние библиотеки можно попробовать использовать Qwt (http://sourceforge.net/projects/qwt/)


Название: Re: Соединение точек отрезками, QGraphicsView
Отправлено: Igors от Октябрь 09, 2010, 16:46
Кстати, все рисуется, но о-очень криво. На скриншоте справа тестовый график, а слева его врядли узнаешь  ???
Я так вижу что наоборот - Ваш намного "прямее"  :) Самое простое взять больше точек для отрезков (если есть откуда брать) - и дорисовать кружки в некоторые