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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Соединение точек отрезками, QGraphicsView  (Прочитано 8164 раз)
perroBasset
Гость
« : Октябрь 07, 2010, 13:45 »

Всем добрый день!
Сразу признаюсь, что я чайник, следовательно и вопрос соответствующий.

Есть точки (в массиве std::vector<QPointF>), которые нужно соединить отрезками. Я тыкалась, тыкалась с QGraphicsLineItem, но ничего не выходит..
Очень надеюсь на вашу помощь  Улыбающийся
« Последнее редактирование: Октябрь 07, 2010, 13:47 от perroBasset » Записан
ufna
Гость
« Ответ #1 : Октябрь 07, 2010, 14:19 »

Вопрос - а что вы понимаете под "соединить отрезками"? Вам нужно отрисовать их?
Записан
developer
Гость
« Ответ #2 : Октябрь 07, 2010, 14:42 »

QPolygon, or something like QPolygonGraphicsItem
Записан
perroBasset
Гость
« Ответ #3 : Октябрь 07, 2010, 18:46 »

Да, отрисовать, причем сами сами точки уже отмечены кружками, их осталось только соединить прямыми.
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #4 : Октябрь 07, 2010, 18:49 »

ВОзьмите за основу пример diagramscene.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Октябрь 07, 2010, 19:59 »

Ваша проблема в том что "соединение отрезками точек с кружками" не есть "примитив" который QGraphicsScene может понять. Нужно мыслить "объектно" - это не всегда удобно, но приходится  Улыбающийся  Первое что приходит в голову - унаследоваться от QGraphicsPolygonItem (пусть он нарисует все отрезки) а потом добавить рисование кружков.
Записан
perroBasset
Гость
« Ответ #6 : Октябрь 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();
    }
« Последнее редактирование: Октябрь 09, 2010, 14:28 от perroBasset » Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #7 : Октябрь 09, 2010, 14:16 »

Первое, что бросается в глаза - выход за границу массива. Условие выхода из цикла должно быть
Код:
i < Points.size() - 1
Записан
perroBasset
Гость
« Ответ #8 : Октябрь 09, 2010, 14:17 »

Точно, не доглядела, спасибо большое! А в остальном?
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #9 : Октябрь 09, 2010, 14:27 »

А если вот так:
Код:
for (int i = 0; i < Points.size() - 1; i++)
        scene.addLine(QPointF(Points[i], Points[i+1]), QPen(Qt::DashLine));
« Последнее редактирование: Октябрь 09, 2010, 14:40 от Hellraiser » Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #10 : Октябрь 09, 2010, 14:42 »

Еще очень смущает сцена (scene), созданная на стеке.
Записан
perroBasset
Гость
« Ответ #11 : Октябрь 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.
« Последнее редактирование: Октябрь 09, 2010, 15:57 от perroBasset » Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #12 : Октябрь 09, 2010, 16:03 »

Если речь идет о построении графиков и нет ограничений на сторонние библиотеки можно попробовать использовать Qwt
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Октябрь 09, 2010, 16:46 »

Кстати, все рисуется, но о-очень криво. На скриншоте справа тестовый график, а слева его врядли узнаешь  Непонимающий
Я так вижу что наоборот - Ваш намного "прямее"  Улыбающийся Самое простое взять больше точек для отрезков (если есть откуда брать) - и дорисовать кружки в некоторые
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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