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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [ РЕШЕНО ] Popover-like windows  (Прочитано 17929 раз)
joffadark
Гость
« : Август 23, 2016, 20:39 »

Доброго времени суток, форумчане.

Подскажите пожалуйста : есть ли возможность в Qt сделать из QWidget нативное popover-всплывающее окно (NSPopover)? Активировать его по нажатию на QToolButton в другом виджете.  Непонимающий
« Последнее редактирование: Август 25, 2016, 08:42 от joffadark » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Август 24, 2016, 14:46 »

а что мешает использовать NSPopover напрямую?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
joffadark
Гость
« Ответ #2 : Август 24, 2016, 15:36 »

а что мешает использовать NSPopover напрямую?

Не совсем понятно как это сделать.
Для NSPopover нужен NSViewController, в Qt - как я понимаю - возможно получить лишь NSView* (QWidget::winId()).
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Август 24, 2016, 19:28 »

попробовал сделать простой тестовый проект: почти вышло, но там вылазит ненужное Qt-окно, хз как побороть. пробовал использовать QMacNativeWidget, но там тоже окно видно, хоть и прозрачное.

если есть возможность, лучше написать содержимое поповера нативным кодом.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
joffadark
Гость
« Ответ #4 : Август 25, 2016, 07:49 »

попробовал сделать простой тестовый проект: почти вышло, но там вылазит ненужное Qt-окно, хз как побороть. пробовал использовать QMacNativeWidget, но там тоже окно видно, хоть и прозрачное.

если есть возможность, лучше написать содержимое поповера нативным кодом.

Премного благодарен за демо-проект!
Буду разбираться, спасибо!
Записан
joffadark
Гость
« Ответ #5 : Август 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.



« Последнее редактирование: Август 25, 2016, 08:41 от joffadark » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #6 : Август 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];
});

поповер, кстати, можно было банально захватить в блок Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Август 25, 2016, 19:41 »

я тут подумал: надо ж эти окна невидимые прибивать еще по закрытии поповера, кому они нужны в памяти? дописал 2 способа решения этой задачи.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
joffadark
Гость
« Ответ #8 : Август 25, 2016, 20:04 »

я тут подумал: надо ж эти окна невидимые прибивать еще по закрытии поповера, кому они нужны в памяти? дописал 2 способа решения этой задачи.

а я внедрил в продакшн :-) каждый виджет, который должен отрисовываться в виде popover, сам следит за своей "обвязкой".

в процессе обнаружил проблему: если пристыковать (showRelativeToRect) popover к NSView* виджета, который имеет родительский виджет (например выпадайки из кнопки, которая внутри другого QWidget), весь родительский виджет и все его потомки перестают принимать любой ввод (клики, нажатия клавиш), как при модальности. Однако все его слоты продолжают отрабатывать по событиям, как и положено. Отключается только весь ввод. Пытался решить - не получилось.

Вышел из положения просто: привязку делаю к виджету который не имеет родительского виджета (например, главный виджет-окно). При вызове showRelativeToRect передаю NSRect области виджета к которому нужно пристыковаться. Таким образом popover стыкуется к главному окну, но пляшет вокруг области нужного виджета. :-)

Еще popover не подстраивает свой размер под виджет, который в нем отображается. Поэтому достаточно вызвать [popover setContentSize:...] с размерами виджета
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #9 : Август 25, 2016, 22:42 »

каждый виджет, который должен отрисовываться в виде popover, сам следит за своей "обвязкой".
на всякий случай убедись, что и поповер, и его контентВК, и виджет-содержимое вычищаются из памяти (хотя бы банально через печать в dealloc/деструкторе)
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
joffadark
Гость
« Ответ #10 : Август 26, 2016, 06:33 »

каждый виджет, который должен отрисовываться в виде popover, сам следит за своей "обвязкой".
на всякий случай убедись, что и поповер, и его контентВК, и виджет-содержимое вычищаются из памяти (хотя бы банально через печать в dealloc/деструкторе)

Я под этим и имел в виду, что в коде каждого такого виджета и вызываю деструкторы когда нужно. Снаружи есть только один метод ShowPopover(QWidget *stackWidget). И он кроссплатформенный. stackWidget - виджет к которому происходит псевдо-привязка через NSRect. Это в случае Мака, в остальных случаях это просто move к нужным позициям stackWidget и show
« Последнее редактирование: Август 26, 2016, 06:35 от joffadark » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #11 : Август 26, 2016, 10:31 »

строго говоря, там не деструкторы вызываются, а посылается сообщение release Улыбающийся но зачем это делать, если есть ARC, который сам позаботится об очистке памяти? (разве что в деструкторе плюсового класса надо явно обнулять objc-поля/свойства, не уверен работает ли там ARC)

P.S. я только под иос пишу, может в макос там есть отличия какие-то.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
ksk-
Самовар
**
Offline Offline

Сообщений: 178



Просмотр профиля
« Ответ #12 : Август 29, 2017, 08:53 »

А есть ли способ прикрутить popover к иконке приложения в трее?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #13 : Август 29, 2017, 14:20 »

ну дропбокс как-то смог Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
ksk-
Самовар
**
Offline Offline

Сообщений: 178



Просмотр профиля
« Ответ #14 : Декабрь 07, 2017, 15:31 »

А знает ли кто способ заставить изменяться стиль курсора при работе с элементами внутри popever? При наведении на ссылку хотелось бы видеть палец, например.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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