Название: [ РЕШЕНО ] Popover-like windows Отправлено: joffadark от Август 23, 2016, 20:39 Доброго времени суток, форумчане.
Подскажите пожалуйста : есть ли возможность в Qt сделать из QWidget нативное popover-всплывающее окно (NSPopover)? Активировать его по нажатию на QToolButton в другом виджете. ??? Название: Re: Popover-like windows Отправлено: kambala от Август 24, 2016, 14:46 а что мешает использовать NSPopover напрямую?
Название: Re: Popover-like windows Отправлено: joffadark от Август 24, 2016, 15:36 а что мешает использовать NSPopover напрямую? Не совсем понятно как это сделать. Для NSPopover нужен NSViewController, в Qt - как я понимаю - возможно получить лишь NSView* (QWidget::winId()). Название: Re: Popover-like windows Отправлено: kambala от Август 24, 2016, 19:28 попробовал сделать простой тестовый проект: почти вышло, но там вылазит ненужное Qt-окно, хз как побороть. пробовал использовать QMacNativeWidget, но там тоже окно видно, хоть и прозрачное.
если есть возможность, лучше написать содержимое поповера нативным кодом. Название: Re: Popover-like windows Отправлено: joffadark от Август 25, 2016, 07:49 попробовал сделать простой тестовый проект: почти вышло, но там вылазит ненужное Qt-окно, хз как побороть. пробовал использовать QMacNativeWidget, но там тоже окно видно, хоть и прозрачное. если есть возможность, лучше написать содержимое поповера нативным кодом. Премного благодарен за демо-проект! Буду разбираться, спасибо! Название: Re: Popover-like windows Отправлено: joffadark от Август 25, 2016, 08:33 попробовал сделать простой тестовый проект: почти вышло, но там вылазит ненужное Qt-окно, хз как побороть. пробовал использовать QMacNativeWidget, но там тоже окно видно, хоть и прозрачное. если есть возможность, лучше написать содержимое поповера нативным кодом. Еще раз - огромное спасибо! Вроде разобрался с проблемой появления окна. 1) для виджета, который ставится наполнением popover'а нужно указать аттрибут WA_TranslucentBackground и windowFlags Qt::FramelessWindowHint. 2) но внутри виджета ни кнопки, ни текстовые поля, ни другие дочерние для него виджеты не нажимались, не получали фокус - одним словом, не работали. В этом случае, помог дополнительная установка флага окна Qt::SubWindow. 3) Чтобы popover автоматически закрывался при потере фокуса, нужно указать аттрибут popover.behavior = NSPopoverBehaviorTransient; Для наглядности переделал немного проект. Внутрь popover-виджета добавил layout, кнопку и label (чтобы внутри popover все автоподстраивалось под размер). По нажатию кнопки, происходит закрытие popover. Название: Re: [ РЕШЕНО ] Popover-like windows Отправлено: kambala от Август 25, 2016, 13:06 круто :)
только мне пришлось чуть код подправить чтоб у меня собралось: Код
поповер, кстати, можно было банально захватить в блок :) Название: Re: [ РЕШЕНО ] Popover-like windows Отправлено: kambala от Август 25, 2016, 19:41 я тут подумал: надо ж эти окна невидимые прибивать еще по закрытии поповера, кому они нужны в памяти? дописал 2 способа решения этой задачи.
Название: Re: [ РЕШЕНО ] Popover-like windows Отправлено: joffadark от Август 25, 2016, 20:04 я тут подумал: надо ж эти окна невидимые прибивать еще по закрытии поповера, кому они нужны в памяти? дописал 2 способа решения этой задачи. а я внедрил в продакшн :-) каждый виджет, который должен отрисовываться в виде popover, сам следит за своей "обвязкой". в процессе обнаружил проблему: если пристыковать (showRelativeToRect) popover к NSView* виджета, который имеет родительский виджет (например выпадайки из кнопки, которая внутри другого QWidget), весь родительский виджет и все его потомки перестают принимать любой ввод (клики, нажатия клавиш), как при модальности. Однако все его слоты продолжают отрабатывать по событиям, как и положено. Отключается только весь ввод. Пытался решить - не получилось. Вышел из положения просто: привязку делаю к виджету который не имеет родительского виджета (например, главный виджет-окно). При вызове showRelativeToRect передаю NSRect области виджета к которому нужно пристыковаться. Таким образом popover стыкуется к главному окну, но пляшет вокруг области нужного виджета. :-) Еще popover не подстраивает свой размер под виджет, который в нем отображается. Поэтому достаточно вызвать [popover setContentSize:...] с размерами виджета Название: Re: [ РЕШЕНО ] Popover-like windows Отправлено: kambala от Август 25, 2016, 22:42 каждый виджет, который должен отрисовываться в виде popover, сам следит за своей "обвязкой". на всякий случай убедись, что и поповер, и его контентВК, и виджет-содержимое вычищаются из памяти (хотя бы банально через печать в dealloc/деструкторе)Название: Re: [ РЕШЕНО ] Popover-like windows Отправлено: joffadark от Август 26, 2016, 06:33 каждый виджет, который должен отрисовываться в виде popover, сам следит за своей "обвязкой". на всякий случай убедись, что и поповер, и его контентВК, и виджет-содержимое вычищаются из памяти (хотя бы банально через печать в dealloc/деструкторе)Я под этим и имел в виду, что в коде каждого такого виджета и вызываю деструкторы когда нужно. Снаружи есть только один метод ShowPopover(QWidget *stackWidget). И он кроссплатформенный. stackWidget - виджет к которому происходит псевдо-привязка через NSRect. Это в случае Мака, в остальных случаях это просто move к нужным позициям stackWidget и show Название: Re: [ РЕШЕНО ] Popover-like windows Отправлено: kambala от Август 26, 2016, 10:31 строго говоря, там не деструкторы вызываются, а посылается сообщение release :) но зачем это делать, если есть ARC, который сам позаботится об очистке памяти? (разве что в деструкторе плюсового класса надо явно обнулять objc-поля/свойства, не уверен работает ли там ARC)
P.S. я только под иос пишу, может в макос там есть отличия какие-то. Название: Re: [ РЕШЕНО ] Popover-like windows Отправлено: ksk- от Август 29, 2017, 08:53 А есть ли способ прикрутить popover к иконке приложения в трее?
Название: Re: [ РЕШЕНО ] Popover-like windows Отправлено: kambala от Август 29, 2017, 14:20 ну дропбокс как-то смог :)
Название: Re: [ РЕШЕНО ] Popover-like windows Отправлено: ksk- от Декабрь 07, 2017, 15:31 А знает ли кто способ заставить изменяться стиль курсора при работе с элементами внутри popever? При наведении на ссылку хотелось бы видеть палец, например.
Название: Re: [ РЕШЕНО ] Popover-like windows Отправлено: kambala от Декабрь 07, 2017, 23:12 а там какие-то принципиальные отличия от стандартного изменения курсора?
Название: Re: [ РЕШЕНО ] Popover-like windows Отправлено: ksk- от Декабрь 08, 2017, 07:35 а там какие-то принципиальные отличия от стандартного изменения курсора? Он вообще не меняется. |