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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Создание нового устройства рисования ...  (Прочитано 17739 раз)
Юрий-В
Новичок

Offline Offline

Сообщений: 17



Просмотр профиля
« : Октябрь 05, 2022, 13:29 »

Добрый день коллеги !

Есть необходимость создания класса нового устройства рисования аналогичного QWidget, QPrinter, ... !
Цель - написание класса который позволит грузить в него svg и на выходе формировать списки примитивов QPainterPath::ElementType::... для конвертации их в g-code !
Понимаю что это взаимодействие классов QPaint + QPaintEngine + QPaintDevice ! Но вопрос именно в нюансах взаимодействия и реализации !

У кого есть опыт написания таких классов ? Нужны консультации по ходу реализации !

С уважением, Юрий.
ПС - уточню - решение задачи с помощью парсинга XML я знаю - но это это "не по феншую" Qt Улыбающийся ! Хотелось бы реализовать именно через внутренний функционал Qt ! Тем более что он есть ...
« Последнее редактирование: Октябрь 05, 2022, 13:53 от Юрий-В » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Октябрь 05, 2022, 15:16 »

ни один класс из свг модуля не подходит? https://doc.qt.io/qt-5/qtsvg-module.html QSvgRenderer например.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Юрий-В
Новичок

Offline Offline

Сообщений: 17



Просмотр профиля
« Ответ #2 : Октябрь 05, 2022, 15:57 »

Спасибо за ответ !

Интересны любые соображения по данной теме !

На сколько я понял из описания Paint System (https://doc.qt.io/qt-6/paintsystem.html) - класс методы которого можно перегрузить и тем самым можно получить примитивы рисования QPainterPath::ElementType::... это класс QPaintEngine !
Не совсем понятно как получить аналогичный результат от класса QSvgRenderer() ? Если не сложно - поясните пожалуйста !

На данный момент мое затруднение в том что мне не понятно как "связать" классы QPaint + QPaintEngine + QPaintDevice для решения этой задачи ! Вроде читаю доки но блин не понимаю !!! Улыбающийся Ни одного вменяемого примера реализации пока найти не смог !

- как наследоваться и перегрузить методы QPaintEngine - понятно !
- ... остальное в процессе Улыбающийся ...

С уважением, Юрий.
« Последнее редактирование: Октябрь 05, 2022, 16:49 от Юрий-В » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Октябрь 05, 2022, 18:41 »

QSvgGenerator наследуется от QPaintDevice, тут уже ничего придумывать и не надо. если я правильно понимаю, достаточно унаследоваться от QSvgGenerator и перехватывать нужные методы. Либо наследоваться от QPaintDevice и поглядеть в исходники QSvgGenerator, чтобы сделать аналогично, но для вывода в нужный формат.
Цитировать
This paint device represents a Scalable Vector Graphics (SVG) drawing. Like QPrinter, it is designed as a write-only device that generates output in a specific format.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Юрий-В
Новичок

Offline Offline

Сообщений: 17



Просмотр профиля
« Ответ #4 : Октябрь 05, 2022, 19:39 »

Может быть оно конечно и так ...

Но поглядев внимательно header этого класса я не совсем понимаю что именно и как можно перегрузить в этом классе для того что бы решить мою задачу ?!

Сам QSvgGenerator предназначен все таки для генерации svg файлов на основании отрисованых с помощью QPainter примитивов !

А моя задача как раз обратная - получение примитивов на выходе класса ! При том что на входе есть svg файл !

С уважением, Юрий.
« Последнее редактирование: Октябрь 05, 2022, 19:41 от Юрий-В » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Октябрь 05, 2022, 20:02 »

могу лишь посоветовать открыть исходники QPainter и изучить как оттуда извлекать примитивы (если такая возможность вообще есть)
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Юрий-В
Новичок

Offline Offline

Сообщений: 17



Просмотр профиля
« Ответ #6 : Октябрь 06, 2022, 12:26 »

Добрый день !

Спасибо за ответ !

И спасибо за совет !

Тут такое дело ! Я уже потратил какое то время в попытке проанализировать троицу классов и нашел возможность перегрузки методов ! По моему мнению делаются они в классе наследнике QPaintEngine !
QPainter же это класс рисовальщик (собственно и из названия оно логично следует Улыбающийся ) !
 
На данный час мне не понятно как описать взаимодействие классов которые обеспечивают Paint System ?!

Это и является моей проблемой и соответственно моим вопросом ! Улыбающийся

Вроде описание вижу - https://doc.qt.io/qt-6/paintsystem.html ! Улыбающийся
И желание реализовать имею ! Улыбающийся
Но видимо experience мягко говоря не достаточен !!! Улыбающийся

С уважением, Юрий.
ПС Буду премного благодарен за высказывание любых мнений и соображений ! Ну а если кто то имеет такой опыт и может указать "путь истинный" готов отблагодарить ! Улыбающийся
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Октябрь 06, 2022, 16:22 »

Цитировать
Custom Backends
Support for a new backend can be implemented by deriving from the QPaintDevice class and reimplementing the virtual QPaintDevice::paintEngine() function to tell QPainter which paint engine should be used to draw on this particular device. To actually be able to draw on the device, this paint engine must be a custom paint engine created by deriving from the QPaintEngine class.
Цитировать
If one wants to use QPainter to draw to a different backend, one must subclass QPaintEngine and reimplement all its virtual functions. The QPaintEngine implementation is then made available by subclassing QPaintDevice and reimplementing the virtual function QPaintDevice::paintEngine().

судя по описанию, в наследнике QPaintDevice достаточно переопределить лишь один метод, а всю нужную логику написать в наследнике QPaintEngine. Далее при создании QPainter подавать ему своего наследника QPaintDevice.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Юрий-В
Новичок

Offline Offline

Сообщений: 17



Просмотр профиля
« Ответ #8 : Октябрь 06, 2022, 16:43 »

Совершенно согласен с вашей точкой зрения ! Улыбающийся

Таки да ! Я тоже так считаю !

В наследнике QPaintDevice переопределяем paintEngine() и создаем обьект наследника QPaintEngine (в котором в свою очередь преопределены виртуальные методы в которых мы и перехватываем примитивы рисования) !

Но как быть дальше что то я ...
Улыбающийся

С уважением, Юрий.
ПС Могу выложить проект набросков ввиде архива ! Если оно конечно нужно ?
« Последнее редактирование: Октябрь 06, 2022, 16:45 от Юрий-В » Записан
Юрий-В
Новичок

Offline Offline

Сообщений: 17



Просмотр профиля
« Ответ #9 : Октябрь 06, 2022, 17:02 »

Да ! Очень похоже что вы правы !
Судя по описанию класса QPicture (https://doc.qt.io/qt-5/qpicture.html) а он наследуется так же от QPaintDevice ! Класс наследника QPaintDevice скармливается QPainter ! И QPainter отрисовывает нужную svg'шку на QPaintDevice !
Осталось это разумно описать кодом ! Улыбающийся
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #10 : Октябрь 06, 2022, 17:04 »

дальше загружаем свой свг в QSvgRenderer и отрисовываем на свой QPaintDevice через https://doc.qt.io/qt-5/qsvgrenderer.html#render
Цитировать
Since the rendering is performed using QPainter, SVG drawings can be rendered on any subclass of QPaintDevice.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Юрий-В
Новичок

Offline Offline

Сообщений: 17



Просмотр профиля
« Ответ #11 : Октябрь 07, 2022, 10:05 »

Добрый день !

Спасибо !

В общем идея понятна !
Буду пробовать реализовать !
По дальнейшему процессу или результату обязательно отпишусь !

С уважением, Юрий.
Записан
Юрий-В
Новичок

Offline Offline

Сообщений: 17



Просмотр профиля
« Ответ #12 : Октябрь 12, 2022, 12:24 »

Добрый день !

После недолгого копания получился вот такой вот набросок - https://gitlab.com/z34x/codemaker.git

Что то конечно получилось ! Но вопросов поубавилось не значительно Улыбающийся !  

И так :

1 Понимаю что наследование должно быть примерно такое.
2 Понимаю что применение объектов классов наследников QPaintDevice, QPaintEngine и QPainter должно происходить так.

3 Не понимаю как задать  линейные размеры наследнику QPaintDevice ! Логично бы было что бы именно наследник QPaintDevice имел бы виртуальные методы с помощью которых меняются параметры устройства на которое происходит вывод (линейные размеры, единицы измерения ...) ! Но понимаю что моя логика тут конфликтует с действительностью. Улыбающийся
4. Не понимаю что нужно делать в методах begin() и end() при наследовании например классa QPaintDevice. Улыбающийся

Так и хочется сказать - запишите меня на курсы по Qt Улыбающийся)))) ! Ну или растолкуйте невежде ...
Решения подобной задачки я к сожалению в сети не нашел, а научиться писать классы устройств очень хочется ! Улыбающийся

Ну и как следствие - у меня получается конвертировать один из svg файлов который есть в subдиректории /in и его сконвертированный образ в /out ! Он называется Петя.svg ! Но не получается конвертировать остальные ! Причина мне понятна в остальных есть тег g< \> ! Но как решить эту проблему не понятно ! Улыбающийся

Короче вопросов много ...

С уважением, Юрий.
« Последнее редактирование: Октябрь 12, 2022, 12:35 от Юрий-В » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #13 : Октябрь 12, 2022, 14:31 »

наследовать QSvgRenderer особого смысла нет. остальное вроде верно, но я лишь по диагонали посмотрел.

2) иначе б Петю сконвертировать не получилось Улыбающийся
3) думаю, надо такие методы добавлять самому. например, у QSvgGenerator можно контролировать size и resolution.
4) можно ничего не делать, зависит от личной необходимости

что там за g< \> не знаю, в спецификациях свг не разбираюсь. Для теста можно взять Qt пример, который загружает свг (ну или самому такое написать) и проверить отобразит ли он эти картинки. Также глянуть в документации какую спецификацию свг поддерживает Qt и в какой добавлен этот g< \>.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Юрий-В
Новичок

Offline Offline

Сообщений: 17



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

По QSvgRenderer - согласен ! Конечно ! Это обертка для себя ! Улыбающийся

2) иначе б Петю ... - ну да ! Это для меня тоже понятно. Так же как и то что Qt понимает не только тег - g (тег g служит для группировки фигур по смыслу, чтобы поддерживать прозрачную структуру документа. Группа элементов может быть использована повторно.), но и все остальные нюансы современного стандарта SVG ! 

3) думаю, надо такие методы добавлять самому. например, у QSvgGenerator можно контролировать size и resolution. - ну да так и есть ! Но это у QSvgGenerator !
В моем случае в QSvgRenderer можно задать размер области рендеринга setViewBox() и соотношение сторон при отрисовке setAspectRatio() что тоже отлично ! Но где сделать корректировку например единиц изменения я пока не знаю.

4) можно ничего не делать, зависит от личной необходимости - спасибо за уточнение - в этом были сомнения ! Хотя из того что нашел в доках понял примерно так же !

что там за g< \> не знаю, в спецификациях свг не разбираюсь. Для теста можно взять Qt пример, который загружает свг - да, это косвенно я конечно проверил ! Более того в проекте я использую те же самые svg'шки для отрисовки их на QToolButton() ! Поэтому практически уверен что дело не в Qt ! Причина того что у меня не получается в отсутствии моего опыта в данном вопросе !

С уважением, Юрий.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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