Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: yarick от Ноябрь 01, 2012, 21:25



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

Установить виджет поверх всех остальных топовых виджетов можно через setActive. Однако он захватит фокус


Название: Re: Как поменять местами 2 виджета-окна верхнего уровня? (изменить z глубину)
Отправлено: Bepec от Ноябрь 01, 2012, 21:27
дырку делай в нём. На месте курсора.


Название: Re: Как поменять местами 2 виджета-окна верхнего уровня? (изменить z глубину)
Отправлено: yarick от Ноябрь 01, 2012, 21:37
дырку делай в нём. На месте курсора.
Это странно будет выглядеть... хоть и 1 пиксель, но мне такое решение не нравиться


Название: Re: Как поменять местами 2 виджета-окна верхнего уровня? (изменить z глубину)
Отправлено: carrygun от Ноябрь 02, 2012, 11:15
Но он же прозрачный.


Название: Re: Как поменять местами 2 виджета-окна верхнего уровня? (изменить z глубину)
Отправлено: Bepec от Ноябрь 02, 2012, 12:15
Человек просто не читает предложений.

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


Название: Re: Как поменять местами 2 виджета-окна верхнего уровня? (изменить z глубину)
Отправлено: GreatSnake от Ноябрь 02, 2012, 12:32
Сделать в полностью прозрачном виджете дырку... И это как то будет выглядеть? Мдамс.
Интересно, а как ты это предлагаешь реализовать?

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


Название: Re: Как поменять местами 2 виджета-окна верхнего уровня? (изменить z глубину)
Отправлено: Bepec от Ноябрь 02, 2012, 13:01
Прозрачность 100%, рисуем на QPixmap чооорную точку, вызываем createHeuristicMask для чёрного. Получается дырка. Вызываем setMask.

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


Название: Re: Как поменять местами 2 виджета-окна верхнего уровня? (изменить z глубину)
Отправлено: GreatSnake от Ноябрь 02, 2012, 13:06
Ну-ну, а двигать окно это оптимально? Абсолютно бредовое решение.


Название: Re: Как поменять местами 2 виджета-окна верхнего уровня? (изменить z глубину)
Отправлено: Bepec от Ноябрь 02, 2012, 13:14
Я конечно извиняюсь, но передвижение виджета... Обычное передвижение займёт минимум ресурсов. Взамен даёт реализацию дырки.

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

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

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

PPS но вопрос о дырке и о данной реализации к GreatSnake остаётся открытым.


Название: Re: Как поменять местами 2 виджета-окна верхнего уровня? (изменить z глубину)
Отправлено: GreatSnake от Ноябрь 02, 2012, 13:25
Я конечно извиняюсь, но передвижение виджета... Обычное передвижение займёт минимум ресурсов. Взамен даёт реализацию дырки.
Если бы ты хотя бы немного представлял как организована оконная система, то бы не делал таких заявлений.

Цитировать
Могу я увидеть ваше решение этой проблемы?
См. выше (http://www.prog.org.ru/index.php?topic=23431.msg165559#msg165559).

На самом деле, если ТС захочет сделать задуманное кросс-платформенным, то мне его жаль, ибо работы будет немерянно и не факт, что всё будет работать идеально.


Название: Re: Как поменять местами 2 виджета-окна верхнего уровня? (изменить z глубину)
Отправлено: Igors от Ноябрь 02, 2012, 13:37
yarick, скиньте небольшой проект, поковыряемся


Название: Re: Как поменять местами 2 виджета-окна верхнего уровня? (изменить z глубину)
Отправлено: Bepec от Ноябрь 02, 2012, 13:39
to GreatSnake - у вас ссылка указывает на моё сообщение темы. Или вообще на начало темы... Или в опере скрипт неправильно отрихтовывает?

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

PPS скиньте ссылочку на организацию оконной системы(желательно W), авось просветлюсь.


Название: Re: Как поменять местами 2 виджета-окна верхнего уровня? (изменить z глубину)
Отправлено: yarick от Ноябрь 02, 2012, 14:44
yarick, скиньте небольшой проект, поковыряемся
Да ладно, я подумал что всё равно возникнут проблемы, даже если дырку сделать и фокус возвращать - всё равно проблема будет. Я предоставлю возможность пользователю делать любое окно поверх других (топовым), соответственно над таким окном будет не установить виджет с нарисованными стрелочками без передачи фокуса... Впрочем даже если и эту проблему решить - это кривая реализация и кросслпатформенность пострадает.

Я решил что лучше буду в окнах рисовать стрелочки, а если из одного окна в другое ведём стрелочку - то она будет обрываться между окнами - ну и ладно. Если окна рядом стоят  - это не так заметно