Название: Загрузка изображения для плагина в 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) Код: <widget class="myClass" name="Lalala"> Название: Re: Загрузка изображения для плагина в QtDesigner Отправлено: Гурман от Сентябрь 30, 2016, 00:42 Я так понимаю, domXml() предназначен для динамических пропертей, которые могут в рантайме появляться. Q_PROPERTY это запись времени компиляции. XML файл этот - для сборки приложения. В дизайнере оно может и по-другому работать. Но если всё сделано так, что статические и динамические проперти могут жить совместно - это замечательно. Мне меньше возни. В скором времени проверю.
Название: Re: Загрузка изображения для плагина в QtDesigner Отправлено: Bepec от Сентябрь 30, 2016, 00:56 Хотя не, всё логично. Если возвращать его из внешнего файла, то как раз динамика и получается. Понятненько. Название: 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
|