Реализация диалоговых уведомлений, которые не крадут фокус у полноэкранных приложений? - PullRequest
5 голосов
/ 05 февраля 2012

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

Как мне реализовать это? Могу ли я узнать о каких-либо общих практиках программирования и UX?

Ответы [ 3 ]

1 голос
/ 05 февраля 2012

Не пробовал, но похоже, что

my_dialog->setWindowFlags(Qt::CustomizeWindowFlags | ... | Qt::WindowStaysOnTopHint);

должно работать, в сочетании с немодальным режимом.

0 голосов
/ 26 февраля 2018

Это выглядит довольно старая тема. Однако я не видел, чтобы кто-нибудь отправлял правильный ответ, который просто работает, поэтому я публикую свое решение той же проблемы, с которой я недавно столкнулся.

Прежде всего, если вы хотите, чтобы ваш диалог не захватывал фокус из других диалогов или полей ввода, вы должны установить следующее свойство: Qt :: WA_ShowWithoutActivating . Используя это свойство, окно (диалоговое окно также является окном) будет отображаться без активации. Затем, возможно, вы захотите настроить свой диалог в соответствии со своими потребностями, и вы захотите, чтобы этот диалог отображался сверху. Таким образом, следующие квестовые флаги могут быть установлены для достижения такого результата кроссплатформенным образом: Qt :: FramelessWindowHint | Qt :: NoDropShadowWindowHint | Qt :: X11BypassWindowManagerHint | Qt :: Tool | Qt :: WindowStaysOnTopHint | Qt :: WindowTransparentForInput | Qt :: WindowDoesNotAcceptFocus .

Приведенный ниже код является одним из примеров того, как создать диалоговое окно, которое немодально, и не привлекает внимание ни у кого (при условии, что dialog - это переменная, указывающая на действительный экземпляр QDialog):

dialog->setAttribute(Qt::WA_ShowWithoutActivating, true);
dialog->setWindowFlags(dialog.windowFlags() | Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint | Qt::X11BypassWindowManagerHint | Qt::Tool | Qt::WindowStaysOnTopHint | Qt::WindowTransparentForInput | Qt::WindowDoesNotAcceptFocus);
0 голосов
/ 05 февраля 2012

Прежде всего вам необходимо создать немодальное диалоговое окно :

Немодальное диалоговое окно - это диалоговое окно, которое работает независимо от других окон в том же приложении.Диалоги поиска и замены в текстовых процессорах часто не работают, чтобы позволить пользователю взаимодействовать как с главным окном приложения, так и с диалоговым окном.

Для достижения этого вам необходимо вызвать show функция, а не exec одна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...