Russian Qt Forum

Компиляторы и платформы => Mac OS X => Тема начата: joffadark от Август 23, 2016, 20:39



Название: [ РЕШЕНО ] 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
круто :)

только мне пришлось чуть код подправить чтоб у меня собралось:
Код
C++ (Qt)
popoverForm->setPopover((__bridge void *)popover);
QObject::connect(popoverForm, &PopoverForm::CloseButtonClicked, [popoverForm]{
   NSPopover* parentalPopover = (__bridge NSPopover *)popoverForm->getPopover();
   [parentalPopover close];
});

поповер, кстати, можно было банально захватить в блок :)


Название: 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
а там какие-то принципиальные отличия от стандартного изменения курсора?

Он вообще не меняется.