LINUX.ORG.RU

Qt. QWidget vs QGraphicScene (и прочие) и QML

 ,


0

3

Недавно был большой тред посвящённый софту, которого не хватает в GNU\Linux. Как было отмечено ещё на первой странице, не хватает чаще всего узкоспециализированного софта. Такая же ситуация у меня. Есть одна фриварная программа для венды. В то же время в профессии популярна GNU\Linux (основной софт требует RHEL). Таким образом, я и многие мои коллеги используем вендовую программу через wine, что влечёт определённые неудобства. К тому же мне недостаёт кое-какого функционала. В общем есть смысл в создании аналога своими силами. Я не программист, но меня никто не гонит и есть желание сделать хорошо, попутно обучаясь. Это не первая моя тема на этом форуме, связанная с эти проектом, думаю, что и не последняя. Прошу отнестись с пониманием.

Программа должна читать файл определённого формата (не графика) и отрисовывать его при помощи графических примитивов. Чтение формата реализовано. Для отрисовки и графического интерфейса я хочу использовать Qt. Пока накидал прототип с рисованием на QWidget, т.е. отрисовываю информацию как один объект. Вычитал, что в Qt рекомендуют использовать QGraphicsScene и компанию, а в последнее время всё чаще встречается QML. Переход от рисования на QWidget к QGraphicScene или QML выглядит как усложнение. Однако возможность, используя QML собирать приложение как для десктопа, так и для android звучит очень заманчиво. У меня нет задачи создания супер навороченного приложения. К тому же Qt очень большой и довольно сложный фреймворк, так что сам буду разбираться слишком долго. Потому решил обратится с вопросами к опытным разработчикам:

Есть ли преимущества у QGraphicScene перед QWidget в случае работы с одни объектом? Каков в работе QML, можно ли работать в одном проекте и собирать под разные платформы или всё же придётся держать 2 проекта, пусть и изрядная часть кода будет общей?

Каков в работе QML, можно ли работать в одном проекте и собирать под разные платформы или всё же придётся держать 2 проекта, пусть и изрядная часть кода будет общей?

qbs умеет в разные профили, всё остальное по идее тоже, так что с этим проблем быть не должно.

ya-betmen ★★★★★
()
Последнее исправление: ya-betmen (всего исправлений: 1)
  • Если тебе нужен порт софта под мобильники, используй QML;
  • В случае, если то, что ты планируешь рисовать, можно описать концепцией «объекты», то посмотри в сторону QGraphicScene;
  • Для графиков потыкай qwt;
  • Для всего остального рисуй на виджете и не обращая внимания на всякие модные веяния.
XMs ★★★★★
()
Ответ на: комментарий от XMs

Файл состоит из набора объектов, которые можно отрисовать линиями и полигонами. Если я правильно понял из описания QGraphicScene, объект(item) не может рисовать за пределами boundingRect, а это не совсем то что мне надо. Мне не нравится как выглядит, лучше когда объекты могут (в разумных пределах) «залезать» на территорию соседних при отрисовке.

Собирать программу под android это не цель, но было бы приятным бонусом, если сложность перехода от рисования на виджете к qml не слишком запредельная и не требует держать код отдельно для разных платформ.

flyshoot
() автор топика
Ответ на: комментарий от flyshoot

Если я тебя правильно понял, ты можешь рисовать в QPixmap, а потом размещать их, как тебе надо, через метод addPixmap(). Либо вообще всё делать через addPolygon(). Бонусом получишь все плюшки QGraphicScene (всплывающие подсказки, выделение, перемещение, etc)

XMs ★★★★★
()
Последнее исправление: XMs (всего исправлений: 1)

Каков в работе QML

Супер классный.

можно ли работать в одном проекте и собирать под разные платформы

Да.

BruteForce ★★★
()
Ответ на: комментарий от flyshoot

Файл состоит из набора объектов, которые можно отрисовать линиями и полигонами

А OpenGL тебе не пойдет тогда? Или нужен софтварный рендер?

peregrine ★★★★★
()
Ответ на: комментарий от XMs

О таком варианте я не думал, но он не совсем подходит, я хоте реализовать возможность получения дополнительной информации пользователем об объекте над которым находится курсор. В случае с виджетом придётся вычислять объект, исходя из положения курсора и параметров отрисовки, а с QGraphicScene сцена сама передаёт в объект событие, но там другие проблемы. В любом случае спасибо.

flyshoot
() автор топика
Ответ на: комментарий от peregrine

Или нужен софтварный рендер?

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

flyshoot
() автор топика
Ответ на: комментарий от flyshoot

в qml завезли софтварный рендеринг в последних релизах, можешь смело использовть если без гпу это крайний случай, работать уи них будет.

LiBer ★★★
()

QML конечно же.
Тебе нужно будет унаследоваться от QQuickItem. Там с помощью обёртки над opengl пишешь рендер своей геометрии. Будет поддержка аппаратного ускорения. Вот пример кривой Безье: http://doc.qt.io/qt-5/qtquick-scenegraph-customgeometry-example.html

P.S. ИМХО если геометрических объектов много, то лучше это делать одним элементом qml, который будет их рендерить.

ox55ff ★★★★★
()
Ответ на: комментарий от flyshoot

А что за проблемы?


возможность получения дополнительной информации пользователем об объекте над которым находится курсор

Делаешь свой класс, наследованный от QGraphics{Pixmap,Polygon,Whatever}Item и переопределяешь в нём обработку событий. По-моему, как раз то, что тебе нужно

XMs ★★★★★
()
Последнее исправление: XMs (всего исправлений: 2)
Ответ на: комментарий от flyshoot

https://doc.qt.io/qt-5/qgraphicsitem.html#sorting

All items are drawn in a defined, stable order, and this same order decides which items will receive mouse input first when you click on the scene. Normally you don't have to worry about sorting, as the items follow a «natural order», following the logical structure of the scene.

An item's children are stacked on top of the parent, and sibling items are stacked by insertion order (i.e., in the same order that they were either added to the scene, or added to the same parent). If you add item A, and then B, then B will be on top of A. If you then add C, the items' stacking order will be A, then B, then C

XMs ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.