MyTetra Share
Делитесь знаниями!
Как добавить ломанную линию на QGraphicsScene
Время создания: 08.07.2021 14:18
Текстовые метки: qt, QGraphicsScene, ломанная линия, scene, graph, break lines
Раздел: Компьютер - Программирование - Язык C++ (Си++) - Библиотека Qt - Графика
Запись: xintrea/mytetra_syncro/master/base/16257430845s3ua27307/text.html на raw.github.com

Удивительно, но в QGraphicsScene не предусмотрено такой простой, казалось бы вещи, как отрисовка ломанной линии. Есть отрисовка прямых линий между двумя точками, эллипсов, прямоугольников, произвольных полигонов, картинок. Но нет явного механизма для отрисовки ломанной линии. Что делать?



Одно из решений такое: создать собственный класс BreakLines, унаследованный от QGraphicsItemGroup, который будет содержать внутри себя несколько QGraphicsLineItem. Каждый элемент QGraphicsLineItem - это один из сегментов ломанной линии. Объект класса BreakLines можно положить на QGraphicsScene с помощью метода addItem().



Но неужели нельзя сделать проще? Ведь произвольный полигон, например класса QPolygon - это и есть ломанная линия, только замкнутая. Может быть, можно нарисовать полигон незамкнутым? Может быть, у полигона есть установка свойств замкнутости/незамкнутости? Читаем документацию, и видим, что такой возможности нет.


И все-таки существует достаточно простой способ поместить на QGraphicsScene ломанную линию. В Qt есть класс QPainterPath, который является представлением незамкнутого контура. У этого класса есть одна маленькая проблема: начальную точку надо задавать методом moveTo(), а последующие точки добавляются методом lineTo(). Нельзя просто так создать объект незамкнутого контура и просто напихать в него координаты точек, чтобы по ним нарисовалась ломанная линия (иногда необходим именно такой подход).


Решение следующее: у QPolygon есть конструктор, который принимает QVector<QPoint>, то есть набор координат точек ломанной линии. А у QPainterPath есть метод addPolygon(). Совместив все вместе получается простая методика размещения ломанной линии на сценграфе:



QVector<QPoint> points;

points.append( QPoint(100,100));

points.append( QPoint(250,250));

points.append( QPoint(150,300));


QPainterPath painterPath;

painterPath.addPolygon( QPolygon(points) );


QGraphicsScene scene;

scene.addPath( painterPath );



Вот таким образом рисуется ломанная линия в Qt.


Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования