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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Загрузка изображения для плагина в QtDesigner  (Прочитано 8296 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Сентябрь 29, 2016, 13:05 »

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

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

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

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

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

2^7-1 == 127, задумайтесь...
Bepec
Гость
« Ответ #1 : Сентябрь 29, 2016, 17:54 »

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

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

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Сентябрь 29, 2016, 19:24 »

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

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

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

2^7-1 == 127, задумайтесь...
Bepec
Гость
« Ответ #3 : Сентябрь 29, 2016, 20:24 »

Достаточно.
При установке пути он вызывает setPixmap, где происходит загрузка картинки, которая потом отрисовывается в paintEvent.

PS это эмпирически проверяется за 2 минуты... Просто создав такой плагин Веселый
« Последнее редактирование: Сентябрь 29, 2016, 20:27 от Bepec » Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #4 : Сентябрь 30, 2016, 00:19 »

Достаточно.
При установке пути он вызывает setPixmap, где происходит загрузка картинки, которая потом отрисовывается в paintEvent.

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

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

2^7-1 == 127, задумайтесь...
Bepec
Гость
« Ответ #5 : Сентябрь 30, 2016, 00:34 »

Я к сожалению не в курсе  механизма добавление пропертей в "domxml", но мне кажется что он действует ВМЕСТЕ с пропертями. (можете примерчик привести, допустим Веселый)
Т.е. у меня в 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>
« Последнее редактирование: Сентябрь 30, 2016, 00:36 от Bepec » Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #6 : Сентябрь 30, 2016, 00:42 »

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

2^7-1 == 127, задумайтесь...
Bepec
Гость
« Ответ #7 : Сентябрь 30, 2016, 00:56 »

domxml же статичен. Всмысле он возвращает статичную строку и после компиляции плагина она не может быть изменена.
Хотя не, всё логично. Если возвращать его из внешнего файла, то как раз динамика и получается. Понятненько.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #8 : Октябрь 03, 2016, 13:44 »

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

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #9 : Октябрь 03, 2016, 20:42 »

Во блин неожиданно... оказывается дизайнер позволяет загруженным в него плагинам брать ресурсы... из главного приложения. Причем даже если оно не запущено, и даже не собрано - ресурсы берутся из файла .qrc главного приложения. Окак!

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

2^7-1 == 127, задумайтесь...
Bepec
Гость
« Ответ #10 : Октябрь 03, 2016, 22:13 »

Ну дык я об этом и говорил...
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


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

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

2^7-1 == 127, задумайтесь...
Bepec
Гость
« Ответ #12 : Октябрь 03, 2016, 23:32 »

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

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

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #13 : Октябрь 04, 2016, 00:25 »

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

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

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

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

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

Записан

2^7-1 == 127, задумайтесь...
Bepec
Гость
« Ответ #14 : Октябрь 04, 2016, 00:36 »

Как вариант сделайте функцию инициализации, подцепленную на SingleShot. В принципе должна решить ваши проблемы Улыбающийся
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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