Russian Qt Forum
Ноябрь 24, 2024, 15:24
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Пользовательский интерфейс (GUI)
>
сделать окно активным
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: сделать окно активным (Прочитано 14589 раз)
Alex Custov
Джедай : наставник для всех
Offline
Сообщений: 2063
сделать окно активным
«
:
Октябрь 12, 2008, 23:26 »
это обсуждали в qt-interest. Окно (в X11 по крайней мере) средствами Qt нельзя сделать выше других (чтобы это работало в 100% случаев). Нужно использовать платформенно-зависимый код для общения с window manager'ом, и для каждой платформы оборачивать его ifdef-ами. В X11 используйте NETWM.
Записан
ритт
Гость
Re: сделать окно активным
«
Ответ #1 :
Октябрь 13, 2008, 00:00 »
это к чему было?
вообще, т.к. Х-сервер не занимается окнами, а оставляет эту задачу оконному менеджеру, код будет не платформо-зависимым, а оконно-менеджеро-зависимым. причём, в некторых оконных менеджерах сделать как требуется так и не удастся по причине их кривизны.
используйте КДЕ
Записан
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: сделать окно активным
«
Ответ #2 :
Октябрь 13, 2008, 06:22 »
Нужно ориентироваться на самые основные: KDE, Gnome, XFCE. Кстати, начиная с 4 версии, KDE доступен и для винды.
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
lana
Гость
Re: сделать окно активным
«
Ответ #3 :
Октябрь 13, 2008, 11:14 »
Спасибо.
Цитата: Alex_X от Октябрь 12, 2008, 23:26
это обсуждали в qt-interest. Окно (в X11 по крайней мере) средствами Qt нельзя сделать выше других (чтобы это работало в 100% случаев). Нужно использовать платформенно-зависимый код для общения с window manager'ом, и для каждой платформы оборачивать его ifdef-ами. В X11 используйте NETWM.
Записан
Alex Custov
Джедай : наставник для всех
Offline
Сообщений: 2063
Re: сделать окно активным
«
Ответ #4 :
Октябрь 13, 2008, 16:18 »
Цитата: Константин от Октябрь 13, 2008, 00:00
это к чему было?
вообще, т.к. Х-сервер не занимается окнами, а оставляет эту задачу оконному менеджеру
X сервер создаёт почву для работы wm.
Цитата: Константин от Октябрь 13, 2008, 00:00
вообще, т.к. Х-сервер не занимается окнами, а оставляет эту задачу оконному менеджеру, код будет не платформо-зависимым, а оконно-менеджеро-зависимым. причём, в некторых оконных менеджерах сделать как требуется так и не удастся по причине их кривизны.
используйте КДЕ
Если wm netwm-совместим (большинство современных wm, в т.ч. и KWin), то нас недолжно волновать, что
Цитата: Константин от Октябрь 13, 2008, 00:00
причём, в некторых оконных менеджерах сделать как требуется так и не удастся по причине их кривизны.
достаточно дёрнуть атом _NET_ACTIVE_WINDOW для нашего окна, и всё остальное должен сделать wm.
Это будет решение для X11. Для винды нужно писать, как я уже говорил, другой код и оборачивать его в #ifdef
Вообще, если интересно как это работает со стороны клиента, то можно посмотреть код fspanel - это предок fbpanel, прога на чистом Xlib, и использует X11 вызовы для работы с netwm-совместимым wm-ом.
Записан
shadone
Гость
Re: сделать окно активным
«
Ответ #5 :
Октябрь 19, 2008, 01:34 »
Вышенаписанное верно. Хочу только добавить что в Qt есть функции для управления окном - QWidget::activateWindow() и QWidget::raise()
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: сделать окно активным
«
Ответ #6 :
Ноябрь 19, 2008, 12:00 »
Цитата: ddenis от Октябрь 19, 2008, 01:34
Вышенаписанное верно. Хочу только добавить что в Qt есть функции для управления окном - QWidget::activateWindow() и QWidget::raise()
Да они то есть... Но похоже, что в КДЕ 4.1 они не работают. Сам сейчас не могу разобраться, как заставить окошко показаться на экране по клику на иконке в трее (QTrayIcon). В винде все работает, в КДЕ не хотит...
Правда в винде другой баг - если окно имеет флаг Qt::Tools, то при клике по десктопу оно пропадает
Записан
What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.
COVID не волк, в лес не уйдёт
shadone
Гость
Re: сделать окно активным
«
Ответ #7 :
Ноябрь 26, 2008, 16:31 »
Цитата: Racheengel от Ноябрь 19, 2008, 12:00
Да они то есть... Но похоже, что в КДЕ 4.1 они не работают. Сам сейчас не могу разобраться, как заставить окошко показаться на экране по клику на иконке в трее (QTrayIcon). В винде все работает, в КДЕ не хотит...
будет ли это работать зависит от реализации window manager'а т.к. общего стандарта поведения в X11-мире нет.
Цитата: Racheengel от Ноябрь 19, 2008, 12:00
Правда в винде другой баг - если окно имеет флаг Qt::Tools, то при клике по десктопу оно пропадает
я видел подобное поведение в некоторых window manager в X11 (и это не баг т.к. опять же поведение зависит от реализации window manager'а), но не в винде - проверил сейчас в windows xp в примере examples/widgets/windowflags - окна с типом Qt::Tool не пропадают при потере фокуса. Если вы можете воспроизвести проблему, создайте таску в task-tracker.
Записан
Alex Custov
Джедай : наставник для всех
Offline
Сообщений: 2063
Re: сделать окно активным
«
Ответ #8 :
Ноябрь 26, 2008, 18:10 »
Цитата: ddenis от Ноябрь 26, 2008, 16:31
Цитата: Racheengel от Ноябрь 19, 2008, 12:00
Да они то есть... Но похоже, что в КДЕ 4.1 они не работают. Сам сейчас не могу разобраться, как заставить окошко показаться на экране по клику на иконке в трее (QTrayIcon). В винде все работает, в КДЕ не хотит...
будет ли это работать зависит от реализации window manager'а т.к. общего стандарта поведения в X11-мире нет.
http://www.prog.org.ru/topic_7365_0.html
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: сделать окно активным
«
Ответ #9 :
Ноябрь 26, 2008, 19:13 »
Цитата: ddenis от Ноябрь 26, 2008, 16:31
я видел подобное поведение в некоторых window manager в X11 (и это не баг т.к. опять же поведение зависит от реализации window manager'а), но не в винде - проверил сейчас в windows xp в примере examples/widgets/windowflags - окна с типом Qt::Tool не пропадают при потере фокуса. Если вы можете воспроизвести проблему, создайте таску в task-tracker.
Окно пропадает не при потере фокуса (такого я тоже ни разу не видел), а именно при клике по десктопу и только в винде. У меня при этом parent=0, т.к. окно главное. Думаю, что это все таки баг. Какой бы ни был WM, нет причин самостоятельно скрывать окна.
Тролям написал, но они что то не расчехляются...
Записан
What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.
COVID не волк, в лес не уйдёт
shadone
Гость
Re: сделать окно активным
«
Ответ #10 :
Ноябрь 26, 2008, 20:45 »
Цитата: Alex Custov от Октябрь 13, 2008, 16:18
достаточно дёрнуть атом _NET_ACTIVE_WINDOW для нашего окна, и всё остальное должен сделать wm.
ой, я пропустил это предложение. Никогда не отправляйте сообщения с временной меткой CurrentTime! не забывайте указывать корректную временную метку которую можно получить из QX11Info::appUserTime().
вкратце - система передачи фокуса в X11 основана на временных метках (timestamp) которые хранятся для каждого (top-level) окна (в свойстве _NET_WM_USERTIME) и которые отмечают время когда пользователь последний раз взаимодействовал с этим окном. На основе этих меток windowmanager решает какое из окон должно иметь фокус.
Вот пример взаимодействия пользователя с системой: имеется терминальное приложение где пользователь набирает команду запуска приложения xclock, и каждый раз когда пользователь нажимает клавишу на клавиатуре терминал сообщает windowmanager'у об обновлении временной метки. Далее пользователь нажимает enter для запуска приложения, это приложение создает окно (но пока его не показывает на экране!) и отмечает меткой время создания окна, и затем показывает окно на экране (XMapWindow), после чего windowmanager ищет окно с самой свежей временной меткой, "поднимает" его и передает ему фокус. Но система X11 сетевая и асинхронная, поэтому еще до того как xclock создаст свое окно, либо между созданием окна и его отображанием на экране пользователь может продолжать взаимодействовать с терминальным приложением, вследствии чего его временная метка будет более новая, соответственно после отображения окна xclock на экране он не должен перехватить фокус.
Поэтому в пользовательском приложении есть два способа поднять окно - XRaiseWindow/XSetInputFocus или же послать сообщение _NET_ACTIVE_WINDOW корневому окну. Проблема в том что не гарантируется что windowmanager поддерживает любой из этих способов (и существует много "поломанных" WM который криво реализуют стандарт netwm (kwin не исключение
. Qt использует первый способ.
Цитата: Racheengel от Ноябрь 26, 2008, 19:13
Окно пропадает не при потере фокуса (такого я тоже ни разу не видел), а именно при клике по десктопу и только в винде. У меня при этом parent=0, т.к. окно главное. Думаю, что это все таки баг. Какой бы ни был WM, нет причин самостоятельно скрывать окна.
Тролям написал, но они что то не расчехляются...
такого поведения я у себя тоже не вижу. какой номер таски?
«
Последнее редактирование: Ноябрь 26, 2008, 20:47 от ddenis
»
Записан
Alex Custov
Джедай : наставник для всех
Offline
Сообщений: 2063
Re: сделать окно активным
«
Ответ #11 :
Ноябрь 26, 2008, 21:04 »
Денис Д. вы ли это?
Цитата: ddenis от Ноябрь 26, 2008, 20:45
ой, я пропустил это предложение. Никогда не отправляйте сообщения с временной меткой CurrentTime! не забывайте указывать корректную временную метку которую можно получить из QX11Info::appUserTime().
вкратце - система передачи фокуса в X11 основана на временных метках (timestamp) которые хранятся для каждого (top-level) окна (в свойстве _NET_WM_USERTIME) и которые отмечают время когда пользователь последний раз взаимодействовал с этим окном. На основе этих меток windowmanager решает какое из окон должно иметь фокус.
Всё верно, но разве это важно для окна, которое активизируется насильно через _NET_ACTIVE_WINDOW?
А где в KWin кривости netwm? Чтобы знать на будущее.
Записан
shadone
Гость
Re: сделать окно активным
«
Ответ #12 :
Ноябрь 26, 2008, 21:14 »
Цитата: Alex Custov от Ноябрь 26, 2008, 21:04
Денис Д. вы ли это?
ммм. как видно из ника это я. Либо я не понял вопроса
Цитата: Alex Custov от Ноябрь 26, 2008, 21:04
Всё верно, но разве это важно для окна, которое активизируется насильно через _NET_ACTIVE_WINDOW?
все равно важно передать правильную временную метку иначе окно будет активировано насильно невзирая на то что пользователь в данный момент печатает что-то в другом окне. Мне бы такое поведение ооооочень сильно не понравилось.
Цитата: Alex Custov от Ноябрь 26, 2008, 21:04
А где в KWin кривости netwm? Чтобы знать на будущее.
сходу ничего не вспоминается кроме неподдержки _NET_WM_USER_TIME_WINDOW и во всех случаях работающей возможности отключить функциональности окна (например убрать кнопку закрытия окна), хм. хотя это не относится к спецификации netwm.
Записан
Alex Custov
Джедай : наставник для всех
Offline
Сообщений: 2063
Re: сделать окно активным
«
Ответ #13 :
Ноябрь 26, 2008, 21:16 »
Цитата: ddenis от Ноябрь 26, 2008, 21:14
Цитата: Alex Custov от Ноябрь 26, 2008, 21:04
Денис Д. вы ли это?
ммм. как видно из ника это я. Либо я не понял вопроса
Всегда приятно видеть отечественных сотрудников Троллтеха!
Записан
Alex Custov
Джедай : наставник для всех
Offline
Сообщений: 2063
Re: сделать окно активным
«
Ответ #14 :
Ноябрь 26, 2008, 21:22 »
Раз уж пошла такая пьянка, м.б. активацию окон в Qt сделать через netwm? Потому что чем только люди не занимаются под иксами, чтобы окна активизировать
Тут уже несколько тем было. Да и на лоре тоже. Очень, очень животрепещущая тема.
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...