Библиотека для отображения графиков компонентов с помощью Qt

Я заинтересован в поиске хорошей библиотеки С++ (или базового кода для ее создания) для рисования компонентов интерактивного связанного графа в Qt.

Под связным компонентом графа я подразумеваю графы, узлы которых являются компонентами с входными и выходными секциями в стиле узлов графа в Blender Node Editor или Grasshopper , см . пример .

Под интерактивным я подразумеваю, что мне нужно иметь доступ к положению и расположению компонентов, чтобы пользователь мог выбирать их и взаимодействовать с ними.

Мои требования:

  • для Qt в С++
  • наименьшее количество внешних зависимостей (лучше всего просто библиотека заголовков)
  • поддержка автоматической компоновки (или полуавтоматической, узлы устанавливаются, ребра должны соединяться автоматически)
  • с поддержкой интерактивности (т.е. не просто вывод изображения, скорее всего, на основе QGraphicsScene)

Моя текущая реализация использует GraphViz с QGV, но поддерживает только простые узлы компонентов (без конкретных элементов ввода/вывода). В то время как GraphViz поддерживает элементы записи и html, QGV этого не делает, и выглядит достаточно хлопотным, чтобы правильно реализовать его в ответвлении QGV, учитывая ограничения GraphViz, и мне интересно, нет ли лучшего выбора, пытаясь не использовать GraphViz.

Я также мог бы справиться с простой неграфической библиотекой, которая делает макет с заданными ограничениями размера и ограничениями относительного положения (блоки компонентов имеют фиксированный размер, позиции узлов ввода/вывода фиксированы с учетом местоположения блока компонента).

Ответы (1)

Может быть, слишком поздно, но все же вот библиотека, которую я разрабатываю для редактирования графа узлов общего назначения.

https://github.com/paceholder/nodeeditor

Ключевая особенность:

  • На основе Qt 5.x с C++14
  • На основеQGraphicsScene
  • Узлы ведут себя в соответствии с пользовательскими моделями
  • Никаких зависимостей (только Qt).
  • Различные цветовые стили

Посмотрите видео, чтобы увидеть, на что способна библиотека:1

Для меня немного поздно использовать его для проекта, для которого я планировал его, конечно, но стоит упомянуть об этом где-нибудь. Я могу взглянуть на него, если он мне понадобится в новой системе. Знаете ли вы, насколько хорошо он масштабируется для больших графиков? Я говорю о нескольких сотнях узлов, что вполне обычно для алгоритмических систем. Об одном я узнал позже (но в Python это проект Antimony, проекта Media Lab для САПР, mattkeeter.com/projects/antimony/3 ), и, похоже, он масштабируется до определенного уровня.
С точки зрения производительности рендеринга графиков, он довольно хорошо масштабируется, поскольку основан на сверхбыстром движке QGraphicsScene. Если говорить о распространении сигнала, я предполагаю, что он должен быть немного медленнее, чем скрипт Python (например). Внутри я использую std::shared_ptrдля переноса пользовательских данных и передачи их следующей модели. Это требует некоторого выделения памяти и копирования общих указателей. Так или иначе, одному парню удалось сделать рендерер GLSL в реальном времени на основе этого Node Editor с дюжиной примитивов, которые выдавали 30-60 FPS ( github.com/v0q/CollaborativeResearchProject )
Это именно то, что я искал, совершенно потрясающий! @paceholder