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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как поменять местами 2 виджета-окна верхнего уровня? (изменить z глубину)  (Прочитано 7779 раз)
yarick
Гость
« : Ноябрь 01, 2012, 21:25 »

Виджеты верхнего уровня, как и QMainWindow - это всё окна, имеющие определённый порядок отображения относительно дргу друга (z - показатель глубины).
Кликая на один из виджетов - мы переключаем его на передний план.
Допустим, все наши виджеты - верхнего уровня, т.е. я задал им параметр Qt::WindowStaysOnTopHint
Один из виджетов прозрачный и я хочу использовать его для рисования. И хочу чтобы он отображался поверх топовых окон, но при этом не получал фокуса при клике на него, т.е. клики "проходили" сквозь виджет. Возможно ли такое?

Установить виджет поверх всех остальных топовых виджетов можно через setActive. Однако он захватит фокус
Записан
Bepec
Гость
« Ответ #1 : Ноябрь 01, 2012, 21:27 »

дырку делай в нём. На месте курсора.
Записан
yarick
Гость
« Ответ #2 : Ноябрь 01, 2012, 21:37 »

дырку делай в нём. На месте курсора.
Это странно будет выглядеть... хоть и 1 пиксель, но мне такое решение не нравиться
Записан
carrygun
Гость
« Ответ #3 : Ноябрь 02, 2012, 11:15 »

Но он же прозрачный.
Записан
Bepec
Гость
« Ответ #4 : Ноябрь 02, 2012, 12:15 »

Человек просто не читает предложений.

Сделать в полностью прозрачном виджете дырку... И это как то будет выглядеть? Мдамс.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Ноябрь 02, 2012, 12:32 »

Сделать в полностью прозрачном виджете дырку... И это как то будет выглядеть? Мдамс.
Интересно, а как ты это предлагаешь реализовать?

И хочу чтобы он отображался поверх топовых окон, но при этом не получал фокуса при клике на него, т.е. клики "проходили" сквозь виджет.
Чтобы клики "проходили" сквозь виджет, нужно отловить клик и переслать его соответствующему окну.
Чтобы не получал фокус выстави ему setFocusPolicy( Qt::NoFocus );
« Последнее редактирование: Ноябрь 02, 2012, 12:37 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
« Ответ #6 : Ноябрь 02, 2012, 13:01 »

Прозрачность 100%, рисуем на QPixmap чооорную точку, вызываем createHeuristicMask для чёрного. Получается дырка. Вызываем setMask.

Если пойти дальше, то сделать виджет размером xN, чтобы дырка могла быть подставлена в любой угол экрана. И передвигать виджет вместе с мышкой. (ибо расчёт маски на каждое движение нахожу плохим и неоптимальным решением.)
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Ноябрь 02, 2012, 13:06 »

Ну-ну, а двигать окно это оптимально? Абсолютно бредовое решение.
Записан

Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
« Ответ #8 : Ноябрь 02, 2012, 13:14 »

Я конечно извиняюсь, но передвижение виджета... Обычное передвижение займёт минимум ресурсов. Взамен даёт реализацию дырки.

Могу я увидеть ваше решение этой проблемы?

PS "Не можешь сделать лучше - хотя бы не сделай хуже" ©

update: перечитал желание ТСса - возможно проще будет NoFocus и передача евента в класс-менеджер.

PPS но вопрос о дырке и о данной реализации к GreatSnake остаётся открытым.
« Последнее редактирование: Ноябрь 02, 2012, 13:18 от Bepec » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #9 : Ноябрь 02, 2012, 13:25 »

Я конечно извиняюсь, но передвижение виджета... Обычное передвижение займёт минимум ресурсов. Взамен даёт реализацию дырки.
Если бы ты хотя бы немного представлял как организована оконная система, то бы не делал таких заявлений.

Цитировать
Могу я увидеть ваше решение этой проблемы?
См. выше.

На самом деле, если ТС захочет сделать задуманное кросс-платформенным, то мне его жаль, ибо работы будет немерянно и не факт, что всё будет работать идеально.
« Последнее редактирование: Ноябрь 02, 2012, 13:44 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Ноябрь 02, 2012, 13:37 »

yarick, скиньте небольшой проект, поковыряемся
Записан
Bepec
Гость
« Ответ #11 : Ноябрь 02, 2012, 13:39 »

to GreatSnake - у вас ссылка указывает на моё сообщение темы. Или вообще на начало темы... Или в опере скрипт неправильно отрихтовывает?

PS но в принципе я понял. Это решение хорошо, но... Но если под виджетом будет "чужое окно", тогда пересылка ему QMouseEvent будет затруднительным.

PPS скиньте ссылочку на организацию оконной системы(желательно W), авось просветлюсь.
« Последнее редактирование: Ноябрь 02, 2012, 13:42 от Bepec » Записан
yarick
Гость
« Ответ #12 : Ноябрь 02, 2012, 14:44 »

yarick, скиньте небольшой проект, поковыряемся
Да ладно, я подумал что всё равно возникнут проблемы, даже если дырку сделать и фокус возвращать - всё равно проблема будет. Я предоставлю возможность пользователю делать любое окно поверх других (топовым), соответственно над таким окном будет не установить виджет с нарисованными стрелочками без передачи фокуса... Впрочем даже если и эту проблему решить - это кривая реализация и кросслпатформенность пострадает.

Я решил что лучше буду в окнах рисовать стрелочки, а если из одного окна в другое ведём стрелочку - то она будет обрываться между окнами - ну и ладно. Если окна рядом стоят  - это не так заметно
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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