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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: MainWindow без фокуса  (Прочитано 13251 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Июнь 28, 2014, 15:52 »

Добрый день

Как добиться такого поведения (аттач). MainWindow всегда неактивно (или всегда активно), здесь без разницы, главное что менюшка enabled, а фокус в оном из рабочих окон. Прибамбасы в title мне не нужны.

Спасибо
« Последнее редактирование: Июнь 28, 2014, 15:55 от Igors » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Июль 01, 2014, 13:12 »

Море ответов! (а как любят читать "документацию" Улыбающийся). Ладно, давайте по-другому:

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

Сообщений: 2921



Просмотр профиля
« Ответ #2 : Июль 01, 2014, 14:10 »

Насколько я помню, меню-бар дизеблится при потери окном фокуса только под виндой.
И если я не ошибаюсь, чтобы сбросить такое поведение, нужно игнорировать события WindowActivate/WindowDeactivate.
Записан

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

Сообщений: 4746



Просмотр профиля WWW
« Ответ #3 : Июль 01, 2014, 14:24 »

полагаю, очевидное «ловить событие фокуса и игнорировать его» уже пробовалось Улыбающийся
Записан

Изучением 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
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Июль 01, 2014, 14:38 »

здесь без разницы, главное что менюшка enabled
Кстати, а Вы уверены, что менюшка становится именно disabled при потере фокуса, а не просто перекрашивается неактивной палитрой?
Записан

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

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Июль 01, 2014, 17:04 »

Менюшка: разбирался на OSX, Qt 4.7.4. Там меню активно если

- у приложения всего 1 top-level окно
- нет модальных окон и меню parent = 0
- активное модальное окно = parent менюбара

Не исключено что это по-другому в Вындоуз и/или в более поздних версиях Qt

полагаю, очевидное «ловить событие фокуса и игнорировать его» уже пробовалось Улыбающийся
А чем оно очевидно - это нас только "информируют", фокус все равно заберут/установят. А ловить в нативняке хлопотливо. Напр       
Код
C++ (Qt)
if (msg->message == WM_MOUSEACTIVATE)
*result = MA_NOACTIVATE;
 
Не тут-то было, теперь application не активируется при нажатии - опять латать.

Кстати, а Вы уверены, что менюшка становится именно disabled при потере фокуса, а не просто перекрашивается неактивной палитрой?
Так оба варианта меня не устраивают  Улыбающийся
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #6 : Июль 01, 2014, 17:51 »

полагаю, очевидное «ловить событие фокуса и игнорировать его» уже пробовалось Улыбающийся
А чем оно очевидно - это нас только "информируют", фокус все равно заберут/установят.
я имел в виду в фильтре событий. если вернуть из него тру, то никто его не заберет и не установит.
Записан

Изучением 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
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Июль 01, 2014, 18:33 »

я имел в виду в фильтре событий. если вернуть из него тру, то никто его не заберет и не установит.
К сожалению, для активации это не так, событие приходит когда уже "свершилось", т.е. можно отреагировать но не блокировать
Записан
Bepec
Гость
« Ответ #8 : Июль 01, 2014, 18:37 »

А где вы ловите, если не секрет?
Если вы используете winEvent - это не фильтр...
Записан
Hrundel
Гость
« Ответ #9 : Июль 01, 2014, 22:11 »

Привет, Igors
читал в Digital Productions еще когда CS вышла, что это не окна, а просто виджеты, которые написаны как окна. Поэтому MainWindow никогда не теряет фокус. Потом тоже попробовал такое написать - получилось.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Июль 02, 2014, 11:56 »

Так, ну менюшка побеждается просто подменой палитры. Правда в конструкторе это не проходит (наверное дела с polish/unpolish), но достаточно сделать раз перед первым рисованием.

А чтобы shortcut'ы работали надо сделать так
Код
C++ (Qt)
action->setShortcutContext(Qt::ApplicationShortcut);

Но вот фокус оно упорно принимает. Перехват в нативняке работает через раз. Напр выбрал меню - нормально, фокус остался на рабочем. Но кликнул в title - фокус сменился. Подолбаю еще исходники.

читал в Digital Productions еще когда CS вышла, что это не окна, а просто виджеты, которые написаны как окна. Поэтому MainWindow никогда не теряет фокус. Потом тоже попробовал такое написать - получилось.
Утилитой Spy можно легко убедиться что все окна на скриншоте - нативные окна Вындоуз. В данной теме разговор идет только о top-level окнах (т.е. они могут свободно перемещаться по экрану).

[off]Поверхностные посты (типа "где-то что-то слышал, читал") должны быть в меру. Иногда удается проскочить на шару, но чаще нет  Улыбающийся[/off]
Записан
Hrundel
Гость
« Ответ #11 : Июль 02, 2014, 12:37 »

[off]Поверхностные посты (типа "где-то что-то слышал, читал") должны быть в меру. Иногда удается проскочить на шару, но чаще нет  Улыбающийся[/off]

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

А, кстати, что мешает наследоваться, оставляя поведение и окон и виджета? Раз уж есть такая информация, почему не подумать, как это реально реализовать?
Я писал чистые "окна"-виджеты. Работает.  
« Последнее редактирование: Июль 02, 2014, 12:42 от Hrundel » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Июль 02, 2014, 15:04 »

Гуглю и постоянно натыкаюсь на советы типа
Цитировать
If you create window by CreateWindowEx, you can set the WS_EX_NOACTIVATE extended style. The documentation says:

A top-level window created with this style does not become the foreground window when the user clicks it. The system does not bring this window to the foreground when the user minimizes or closes the foreground window. To activate the window, use the SetActiveWindow or SetForegroundWindow function. The window does not appear on the taskbar by default. To force the window to appear on the taskbar, use the WS_EX_APPWINDOW style.

There should be some way in Qt to pass that style bit.

Но оно работает "наоборот" Улыбающийся Т.е. если кликнул на окно из др приложения - то приложение не переключится (что мне совсем не нужно). Однако если мое приложение активно - такое окно успешно примет фокус.   
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #13 : Июль 02, 2014, 18:25 »

задайте вопрос на stackoverflow и на оф. форуме Qt
Записан

Изучением 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
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #14 : Июль 02, 2014, 18:36 »

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


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