Russian Qt Forum

Qt => Qt-инструментарий => Тема начата: Гурман от Сентябрь 29, 2016, 13:05



Название: Загрузка изображения для плагина в QtDesigner
Отправлено: Гурман от Сентябрь 29, 2016, 13:05
Изображение в формате SVG-графики загружено в ресурсы основного приложения. Но использоваться оно должно в плагине, который в QtDesigner размещается на основном окне приложения, как самодельный виджет. Я по-началу сделал задание динамических свойств плагинов в domXml() функции. Я могу там выбрать файл ресурсов для изображения, но оно разумеется в дизайнере не подгружается, и не появляется. Не видно, как это можно реализовать в случае domXml(). Есть ещё вариант задания свойств с помощью Q_PROPERTIES. Вопрос к тем, кто точно делал, и точно знает ответ - если я задам свойство плагина в виде

Код:
Q_PROPERTY(QPixmap pixmap READ pixmap WRITE setPixmap)

, реализую функцию setPixmap(), которая будет грузить изображение из SVG-ресурса, и соответственно реализую в плагине paintEvent() для рисования - этого будет достаточно, чтобы в QtDesigner при выборе ресурса он сразу появлялся на виджете? Или что-то ещё надо для этого сделать?

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

Диггинг документации ответов не дал - тут только если кто-то уже сам нарыл, может помочь.


Название: Re: Загрузка изображения для плагина в QtDesigner
Отправлено: Bepec от Сентябрь 29, 2016, 17:54
Задайте просто пропертю.
И если плагин отрисовывает себя нормально, оно так же появится в дизайнере.

PS у меня так кнопки разноцветные работают. Правда там строки четко заданы аля "Resources/red.png".


Название: Re: Загрузка изображения для плагина в QtDesigner
Отправлено: Гурман от Сентябрь 29, 2016, 19:24
Задайте просто пропертю.
И если плагин отрисовывает себя нормально, оно так же появится в дизайнере.

PS у меня так кнопки разноцветные работают. Правда там строки четко заданы аля "Resources/red.png".

Чтобы плагин себя отрисовал, у него должна быть функция, которая загружает изображение из файла, когда имя файла задано в дизайнере. Для SVG надо сначала объект соответствующего класса создать, и вызвать его load(svgfilename). А рисовать в paintEvent() - эта функция в дизайнере то вызовется, но вот загрузка - нет. Чтобы загрузка вызвалась при выборе нового ресурса в проперти плагина, надо связать это проперти с соответствующим методом. Я смотрел, как в QLabel сделано, вижу в задании Q_PROPERTIES метода setPixmap. Но мне не ясно - этого достаточно? Больше ничего не потребуется? А может можно в domXml() метод загрузки прицепить?


Название: Re: Загрузка изображения для плагина в QtDesigner
Отправлено: Bepec от Сентябрь 29, 2016, 20:24
Достаточно.
При установке пути он вызывает setPixmap, где происходит загрузка картинки, которая потом отрисовывается в paintEvent.

PS это эмпирически проверяется за 2 минуты... Просто создав такой плагин :D


Название: Re: Загрузка изображения для плагина в QtDesigner
Отправлено: Гурман от Сентябрь 30, 2016, 00:19
Достаточно.
При установке пути он вызывает setPixmap, где происходит загрузка картинки, которая потом отрисовывается в paintEvent.

PS это эмпирически проверяется за 2 минуты... Просто создав такой плагин :D

То есть, мне надо только реализовать в своём виджете функцию, задаваемую в Q_PROPERTY? Она будет получать QString с именем выбраного ресурса? И чтобы это заработало - аналогичную запись с Q_PROPERTY? Правда у меня там куча других проперти в domXml(), наверно придётся их все в Q_PROPERTY переделывать.


Название: Re: Загрузка изображения для плагина в QtDesigner
Отправлено: Bepec от Сентябрь 30, 2016, 00:34
Я к сожалению не в курсе  механизма добавление пропертей в "domxml", но мне кажется что он действует ВМЕСТЕ с пропертями. (можете примерчик привести, допустим :D)
Т.е. у меня в domXML стоит только
Код:
"<widget class=\"myClass\" name=\"Lalala\">\n</widget>\n"
Имеются проперти
Код:
		Q_PROPERTY(QPixmap backgroundImage READ backgroundImage WRITE setBackgroundImage DESIGNABLE true USER true)
Q_PROPERTY(QPixmap needleImage READ needleImage WRITE setNeedleImage DESIGNABLE true USER true)
Q_PROPERTY(QPixmap needleImageNotSelect  READ needleNotSelectImage WRITE setNeedleNotSelectImage DESIGNABLE true USER true)

Q_PROPERTY(int distanceNeedle READ distanceNeedle WRITE setDistanceNeedle DESIGNABLE true USER true)
Q_PROPERTY(int distanceFrame READ distanceFrame WRITE setDistanceFrame DESIGNABLE true USER true)
Q_PROPERTY(int updateDelay READ updateDelay WRITE setUpdateDelay DESIGNABLE true USER true)
Q_PROPERTY(bool selected READ isSelected WRITE setSelected DESIGNABLE true USER true)

Q_PROPERTY(int camCommand READ getCommand WRITE setCommand DESIGNABLE true USER true)
Q_PROPERTY(bool ShowStep READ isShowStep WRITE setShowStep DESIGNABLE true USER true)
В результате получается после добавления и изменения пары параметров такой вот xml в ui файле
Код:
  <widget class="myClass" name="Lalala">
   <property name="geometry">
    <rect>
     <x>229</x>
     <y>374</y>
     <width>45</width>
     <height>50</height>
    </rect>
   </property>
   <property name="maximumSize">
    <size>
     <width>50</width>
     <height>50</height>
    </size>
   </property>
   <property name="focusPolicy">
    <enum>Qt::NoFocus</enum>
   </property>
   <property name="backgroundImage">
    <pixmap resource="resourse.qrc">:/Resources/knob_1.png</pixmap>
   </property>
   <property name="needleImage">
    <pixmap resource="resourse.qrc">:/Resources/knob_point_red_selected.png</pixmap>
   </property>
   <property name="needleImageNotSelect" stdset="0">
    <pixmap resource="resourse.qrc">:/Resources/knob_point_red.png</pixmap>
   </property>
   <property name="distanceNeedle">
    <number>12</number>
   </property>
   <property name="distanceFrame">
    <number>2</number>
   </property>
  </widget>


Название: Re: Загрузка изображения для плагина в QtDesigner
Отправлено: Гурман от Сентябрь 30, 2016, 00:42
Я так понимаю, domXml() предназначен для динамических пропертей, которые могут в рантайме появляться. Q_PROPERTY это запись времени компиляции. XML файл этот - для сборки приложения. В дизайнере оно может и по-другому работать. Но если всё сделано так, что статические и динамические проперти могут жить совместно - это замечательно. Мне меньше возни. В скором времени проверю.


Название: Re: Загрузка изображения для плагина в QtDesigner
Отправлено: Bepec от Сентябрь 30, 2016, 00:56
domxml же статичен. Всмысле он возвращает статичную строку и после компиляции плагина она не может быть изменена.
Хотя не, всё логично. Если возвращать его из внешнего файла, то как раз динамика и получается. Понятненько.


Название: Re: Загрузка изображения для плагина в QtDesigner
Отправлено: Гурман от Октябрь 03, 2016, 13:44
Вот же инфекция... Дизайнер передаёт в setPixmap() не имя файла, а сам QPixmap, который в диалоге выбран из ресурсов. А мне надо иметь возможность выбрать либо пиксмап, либо SVG-графику. И соответственно чтобы изображение появилось на виджете. Поддержки выбора SVG пока не вижу.


Название: Re: Загрузка изображения для плагина в QtDesigner
Отправлено: Гурман от Октябрь 03, 2016, 20:42
Во блин неожиданно... оказывается дизайнер позволяет загруженным в него плагинам брать ресурсы... из главного приложения. Причем даже если оно не запущено, и даже не собрано - ресурсы берутся из файла .qrc главного приложения. Окак!

То есть, я в главное приложение напихал ресурсов по маршруту ":/resources/", и использую их в плагинах по этому маршруту. Это работает в рантайме, поскольку ресурсы глобальны. Но оказывается, что плагины, загруженные в дизайнер тоже могут брать ресурсы по этим же маршрутам. Я сделал плагину проперти с вводом имени в строку, только имя и расширение. В самом плагине добавляю его после ":/resources/", и загружаю ресурс в соответствующей функции, которая пристегнута к Q_PROPERTY. И в дизайнере меняется изображение на плагине. Это при том, что главное приложение я вообще не собирал, только добавил ему ресурсы. Круть!  ;D


Название: Re: Загрузка изображения для плагина в QtDesigner
Отправлено: Bepec от Октябрь 03, 2016, 22:13
Ну дык я об этом и говорил...


Название: Re: Загрузка изображения для плагина в QtDesigner
Отправлено: Гурман от Октябрь 03, 2016, 23:07
Но есть другой косяк, с которым не совсем понятно пока что делать. Виджет в дизайнере не инициализируется статическими пропертями. Я сделал проперти типа QString, в который ввожу имя файла ресурса. Если я его ввёл - всё работает. Могу ввести имя картинки PNG, могу SVG - изображение в дизайнере меняется. Но если я сохраняю дизайн и закрываю его - при следующем его открытии все мои виджеты без картинок. Хотя в полях с именами картинок всё есть. Чтобы картинки появились, надо поизменять какие-нибудь проперти моих виджетов, например, изменить состояние флага "переводить". Тогда дизайнер заново вызывает мой setImageFile() с содержимым соответствующего проперти. Тот картинку загружает и она появляется. И пока не ясно, как это корректно побороть. Поскольку не совсем понятно, в какой момент проперти получают свои значения при использовании плагина в дизайнере. Во всяком случае, обращение к проперти в конструкторе виджета не работает - в этот момент оно ещё пустое. А подходящего START у Q_PROPERTIES нет, такого, чтобы он гарантированно вызывался после того, как проперти получат свои значения из XML-файла. Есть некий RESET, но когда он вызывается, ничего не написано.


Название: Re: Загрузка изображения для плагина в QtDesigner
Отправлено: Bepec от Октябрь 03, 2016, 23:32
У меня они жестко забитые. Потому таких проблем не наблюдал. Пробуйте, что и сказать :D

PS по идее они вызываются при создании. Т.е. создаётся виджет, а потом ему инициализируются проперти. Видимо у вас там что-то намудрено.


Название: Re: Загрузка изображения для плагина в QtDesigner
Отправлено: Гурман от Октябрь 04, 2016, 00:25
У меня они жестко забитые. Потому таких проблем не наблюдал. Пробуйте, что и сказать :D

PS по идее они вызываются при создании. Т.е. создаётся виджет, а потом ему инициализируются проперти. Видимо у вас там что-то намудрено.
Именно сначала создаётся виджет, а потом инициализируются проперти. То есть - при создании виджета значений у пропертей ещё нет. Скорее всего даже ещё самих пропертей нет. Что категорически неправильно.

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

RESET не при делах вообще, он совсем для другого.

Как решать - не ясно.



Название: Re: Загрузка изображения для плагина в QtDesigner
Отправлено: Bepec от Октябрь 04, 2016, 00:36
Как вариант сделайте функцию инициализации, подцепленную на SingleShot. В принципе должна решить ваши проблемы :)


Название: Re: Загрузка изображения для плагина в QtDesigner
Отправлено: Гурман от Октябрь 04, 2016, 00:49
Как вариант сделайте функцию инициализации, подцепленную на SingleShot. В принципе должна решить ваши проблемы :)
Иде? В каждом плагине чтобы стреляла? Теоретически можно, только в рантайме она нафик не нужна (впрочем, я могу определить, где вызван плагин - в приложении или в дизайнере). А подгрузить все картинки нескольких виджетов можно и сейчас левой задней ногой - выбрать все виджеты в списке дизайнера (на окне приложения невозможно - они ещё не видны), и щёлкнуть по флажку "переводить" у строки, в которой находится имя картинки. Все картинки загружаются... Через ж конечно, но что поделать, если проперти также сделаны? Одно только название number для целых со знаком у динамических пропертей чего стоит! Как будто школьник-троечник проектировал.


Название: Re: Загрузка изображения для плагина в QtDesigner
Отправлено: Bepec от Октябрь 04, 2016, 01:22
У них вообще вся система плагинов довольно... эммм... хренова :D