Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Igors от Июня 28, 2014, 12:11



Название: примерчик windowflags (Qt 5.2 Windows)
Отправлено: Igors от Июня 28, 2014, 12:11
Добрый день

- oткомпилите и запустите пример windowflags  
- выберите тип окна Tool
- попробуйте перекрыть tool окном управления - получается (аттач) хотя не должно
- выберите тип окна Popup, затем снова Tool
- опять попробуйте перекрыть - теперь не выходит (правильно)
- да, и чего это tool принимает/теряет фокус  ???

Буги-вуги  ???

Edit: виноват, пример все-таки изменен

Код
C++ (Qt)
ControllerWindow::ControllerWindow()
{
//    previewWindow = new PreviewWindow(this);   // оригинал    
   previewWindow = new PreviewWindow(0);   // измените так
...
 
Или можно оставить парента и создать еще одно окно Qt::Window с тем же парентом - результат тот же



Название: Re: примерчик windowflags (Qt 5.2 Windows)
Отправлено: kambala от Июня 28, 2014, 13:40
Цитировать
попробуйте перекрыть tool окном управления - получается (аттач) хотя не должно
в 5.3 не получается, винда 8.1
Цитировать
да, и чего это tool принимает/теряет фокус
потому что это не мак ос


Название: Re: примерчик windowflags (Qt 5.2 Windows)
Отправлено: Igors от Июня 28, 2014, 15:41
Проверил с 5.3.1 (desktop), то же самое

Цитировать
попробуйте перекрыть tool окном управления - получается (аттач) хотя не должно
в 5.3 не получается, винда 8.1
Потому что в примере окно управления парент. Замените его на ноль (см Edit первого поста)

Цитировать
да, и чего это tool принимает/теряет фокус
потому что это не мак ос
Очень убедительно  :)


Название: Re: примерчик windowflags (Qt 5.2 Windows)
Отправлено: kambala от Июня 28, 2014, 18:41
Цитировать
попробуйте перекрыть tool окном управления - получается (аттач) хотя не должно
в 5.3 не получается, винда 8.1
Потому что в примере окно управления парент. Замените его на ноль (см Edit первого поста)
да, теперь перекрывает
Цитировать
да, и чего это tool принимает/теряет фокус
потому что это не мак ос
Очень убедительно  :)
а что, есть закон, запрещающий тул-окнам получать фокус в любой ОС? в эппле решили, что таким окнам фокус не нужен, в мс — наоборот. не вижу причины негодовать по этому поводу.


Название: Re: примерчик windowflags (Qt 5.2 Windows)
Отправлено: Igors от Июня 29, 2014, 11:08
а что, есть закон, запрещающий тул-окнам получать фокус в любой ОС? в эппле решили, что таким окнам фокус не нужен, в мс — наоборот. не вижу причины негодовать по этому поводу.
Да пусть решают где что хотят, но Qt кросс-платформенный фреймворк, и значит мы вправе ожидать одинакового поведения окон (по крайней мере базового). Какой смысл в таком Qt::Tool, чем же оно отличается от Qt::Window? Объяснения, дескать, "платформа" не катят - напр окно не может перекрыть своего парента - на той же платформе, т.е. ф-ционал этот есть.

Ладно, как исправлять? (вопрос со слабой надеждой на ответ  :))


Название: Re: примерчик windowflags (Qt 5.2 Windows)
Отправлено: kambala от Июня 29, 2014, 12:28
писать баг репорт :)


Название: Re: примерчик windowflags (Qt 5.2 Windows)
Отправлено: Igors от Июня 29, 2014, 12:35
писать баг репорт :)
Цитировать
пишет гневное письмо в техподдержку, откуда приезжают дяденьки на джипе и за $10000 соглашаются решить проблему. Расстреливают Qt::Tool из автомата и уезжают обратно.
:)


Название: Re: примерчик windowflags (Qt 5.2 Windows)
Отправлено: Igors от Июля 06, 2014, 18:22
Хотя энтузиазма не видно - все же надо делиться решением. Прильнем к источнику наслаждения
Qt::Tool
Цитировать
If there is a parent, the tool window will always be kept on top of it.
Во всяком случае в Вындоуз это выполняется для всех окон (parent не перекрывает child'а), а не только с флагом Qt::Tool. Но это никак не спасает от перекрытия тул окна всеми кто не его child.
 
Цитировать
If there isn't a parent, you may consider using Qt::WindowStaysOnTopHint as well.
А что же "документация" умалчивает (стыдливо) о том что такое окно будет торчать впереди ВСЕХ Вындоуз окон? Т.е. при переключении на др задачу они не перекрываются. "Заставь дурака богу молиться - он и лоб разобьет"

Пришлось делать так:
 - выставляю Qt::WindowStaysOnTopHint
 - когда приложение теряет фокус (или открывается файл/фонт диалог) пробегаюсь по всем тул окнам и в нативняке снимаю флаг HWND_TOPMOST. Воспользоваться setWindowFlags не удается т.к. он скрывает видимые окна. Потом соответственно возвращаю флаг HWND_TOPMOST.

С интересом послушаю лучшее (или даже просто другое) решение.


Название: Re: примерчик windowflags (Qt 5.2 Windows)
Отправлено: vulko от Июля 18, 2014, 13:51
Код:
Во всяком случае в Вындоуз это выполняется для всех окон (parent не перекрывает child'а), а не только с флагом Qt::Tool. Но это никак не спасает от перекрытия тул окна всеми кто не его child.

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


Код:
If there isn't a parent, you may consider using Qt::WindowStaysOnTopHint as well.
Флаг говорит сам за себя - Window Stays On Top.
Нередко бывают случаи, когда нужно окно которое всегда поверх всего. Даже когда фокус из него ушел.

Советую посмотреть в сторону QDialog.

Код:
С интересом послушаю лучшее (или даже просто другое) решение. 
попкорн не забудь))) решение чего? в чем вопрос?