Russian Qt Forum
Март 29, 2024, 08:35
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Qt-инструментарий
>
Загрузка изображения для плагина в QtDesigner
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Загрузка изображения для плагина в QtDesigner (Прочитано 8296 раз)
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Загрузка изображения для плагина в QtDesigner
«
:
Сентябрь 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
Гость
Re: Загрузка изображения для плагина в QtDesigner
«
Ответ #1 :
Сентябрь 29, 2016, 17:54 »
Задайте просто пропертю.
И если плагин отрисовывает себя нормально, оно так же появится в дизайнере.
PS у меня так кнопки разноцветные работают. Правда там строки четко заданы аля "Resources/red.png".
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Загрузка изображения для плагина в QtDesigner
«
Ответ #2 :
Сентябрь 29, 2016, 19:24 »
Цитата: Bepec от Сентябрь 29, 2016, 17:54
Задайте просто пропертю.
И если плагин отрисовывает себя нормально, оно так же появится в дизайнере.
PS у меня так кнопки разноцветные работают. Правда там строки четко заданы аля "Resources/red.png".
Чтобы плагин себя отрисовал, у него должна быть функция, которая загружает изображение из файла, когда имя файла задано в дизайнере. Для SVG надо сначала объект соответствующего класса создать, и вызвать его load(svgfilename). А рисовать в paintEvent() - эта функция в дизайнере то вызовется, но вот загрузка - нет. Чтобы загрузка вызвалась при выборе нового ресурса в проперти плагина, надо связать это проперти с соответствующим методом. Я смотрел, как в QLabel сделано, вижу в задании Q_PROPERTIES метода setPixmap. Но мне не ясно - этого достаточно? Больше ничего не потребуется? А может можно в domXml() метод загрузки прицепить?
«
Последнее редактирование: Сентябрь 29, 2016, 19:26 от Гурман
»
Записан
2^7-1 == 127, задумайтесь...
Bepec
Гость
Re: Загрузка изображения для плагина в QtDesigner
«
Ответ #3 :
Сентябрь 29, 2016, 20:24 »
Достаточно.
При установке пути он вызывает setPixmap, где происходит загрузка картинки, которая потом отрисовывается в paintEvent.
PS это эмпирически проверяется за 2 минуты... Просто создав такой плагин
«
Последнее редактирование: Сентябрь 29, 2016, 20:27 от Bepec
»
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Загрузка изображения для плагина в QtDesigner
«
Ответ #4 :
Сентябрь 30, 2016, 00:19 »
Цитата: Bepec от Сентябрь 29, 2016, 20:24
Достаточно.
При установке пути он вызывает setPixmap, где происходит загрузка картинки, которая потом отрисовывается в paintEvent.
PS это эмпирически проверяется за 2 минуты... Просто создав такой плагин
То есть, мне надо только реализовать в своём виджете функцию, задаваемую в Q_PROPERTY? Она будет получать QString с именем выбраного ресурса? И чтобы это заработало - аналогичную запись с Q_PROPERTY? Правда у меня там куча других проперти в domXml(), наверно придётся их все в Q_PROPERTY переделывать.
«
Последнее редактирование: Сентябрь 30, 2016, 00:34 от Гурман
»
Записан
2^7-1 == 127, задумайтесь...
Bepec
Гость
Re: Загрузка изображения для плагина в QtDesigner
«
Ответ #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
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Загрузка изображения для плагина в QtDesigner
«
Ответ #6 :
Сентябрь 30, 2016, 00:42 »
Я так понимаю, domXml() предназначен для
динамических
пропертей, которые могут в рантайме появляться. Q_PROPERTY это запись времени компиляции. XML файл этот - для сборки приложения. В дизайнере оно может и по-другому работать. Но если всё сделано так, что статические и динамические проперти могут жить совместно - это замечательно. Мне меньше возни. В скором времени проверю.
Записан
2^7-1 == 127, задумайтесь...
Bepec
Гость
Re: Загрузка изображения для плагина в QtDesigner
«
Ответ #7 :
Сентябрь 30, 2016, 00:56 »
domxml же статичен. Всмысле он возвращает статичную строку и после компиляции плагина она не может быть изменена.
Хотя не, всё логично. Если возвращать его из внешнего файла, то как раз динамика и получается. Понятненько.
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Загрузка изображения для плагина в QtDesigner
«
Ответ #8 :
Октябрь 03, 2016, 13:44 »
Вот же инфекция... Дизайнер передаёт в setPixmap() не имя файла, а сам QPixmap, который в диалоге выбран из ресурсов. А мне надо иметь возможность выбрать либо пиксмап, либо SVG-графику. И соответственно чтобы изображение появилось на виджете. Поддержки выбора SVG пока не вижу.
Записан
2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Загрузка изображения для плагина в QtDesigner
«
Ответ #9 :
Октябрь 03, 2016, 20:42 »
Во блин неожиданно... оказывается дизайнер позволяет загруженным в него плагинам брать ресурсы... из главного приложения. Причем даже если оно не запущено, и даже не собрано - ресурсы берутся из файла .qrc главного приложения. Окак!
То есть, я в главное приложение напихал ресурсов по маршруту ":/resources/", и использую их в плагинах по этому маршруту. Это работает в рантайме, поскольку ресурсы глобальны. Но оказывается, что плагины, загруженные в дизайнер тоже могут брать ресурсы по этим же маршрутам. Я сделал плагину проперти с вводом имени в строку, только имя и расширение. В самом плагине добавляю его после ":/resources/", и загружаю ресурс в соответствующей функции, которая пристегнута к Q_PROPERTY. И в дизайнере меняется изображение на плагине. Это при том, что главное приложение я вообще не собирал, только добавил ему ресурсы. Круть!
Записан
2^7-1 == 127, задумайтесь...
Bepec
Гость
Re: Загрузка изображения для плагина в QtDesigner
«
Ответ #10 :
Октябрь 03, 2016, 22:13 »
Ну дык я об этом и говорил...
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Загрузка изображения для плагина в QtDesigner
«
Ответ #11 :
Октябрь 03, 2016, 23:07 »
Но есть другой косяк, с которым не совсем понятно пока что делать. Виджет в дизайнере не инициализируется статическими пропертями. Я сделал проперти типа QString, в который ввожу имя файла ресурса. Если я его ввёл - всё работает. Могу ввести имя картинки PNG, могу SVG - изображение в дизайнере меняется. Но если я сохраняю дизайн и закрываю его - при следующем его открытии все мои виджеты без картинок. Хотя в полях с именами картинок всё есть. Чтобы картинки появились, надо поизменять какие-нибудь проперти моих виджетов, например, изменить состояние флага "переводить". Тогда дизайнер заново вызывает мой setImageFile() с содержимым соответствующего проперти. Тот картинку загружает и она появляется. И пока не ясно, как это корректно побороть. Поскольку не совсем понятно, в какой момент проперти получают свои значения при использовании плагина в дизайнере. Во всяком случае, обращение к проперти в конструкторе виджета не работает - в этот момент оно ещё пустое. А подходящего START у Q_PROPERTIES нет, такого, чтобы он гарантированно вызывался после того, как проперти получат свои значения из XML-файла. Есть некий RESET, но когда он вызывается, ничего не написано.
«
Последнее редактирование: Октябрь 03, 2016, 23:17 от Гурман
»
Записан
2^7-1 == 127, задумайтесь...
Bepec
Гость
Re: Загрузка изображения для плагина в QtDesigner
«
Ответ #12 :
Октябрь 03, 2016, 23:32 »
У меня они жестко забитые. Потому таких проблем не наблюдал. Пробуйте, что и сказать
PS по идее они вызываются при создании. Т.е. создаётся виджет, а потом ему инициализируются проперти. Видимо у вас там что-то намудрено.
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Загрузка изображения для плагина в QtDesigner
«
Ответ #13 :
Октябрь 04, 2016, 00:25 »
Цитата: Bepec от Октябрь 03, 2016, 23:32
У меня они жестко забитые. Потому таких проблем не наблюдал. Пробуйте, что и сказать
PS по идее они вызываются при создании. Т.е. создаётся виджет, а потом ему инициализируются проперти. Видимо у вас там что-то намудрено.
Именно сначала создаётся виджет, а потом инициализируются проперти. То есть - при создании виджета значений у пропертей ещё нет. Скорее всего даже ещё самих пропертей нет. Что
категорически неправильно
.
Для рантайма я в виджетах сделал специальную функцию инициализации, которая вызывается из главного приложения, забирает из пропертей прописанные там значения и переносит в локальные переменные виджета. Но в дизайнере это не работает, он не знает про необходимость инициализации.
RESET не при делах вообще, он совсем для другого.
Как решать - не ясно.
Записан
2^7-1 == 127, задумайтесь...
Bepec
Гость
Re: Загрузка изображения для плагина в QtDesigner
«
Ответ #14 :
Октябрь 04, 2016, 00:36 »
Как вариант сделайте функцию инициализации, подцепленную на SingleShot. В принципе должна решить ваши проблемы
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...