Показать окно в Qt без кражи фокуса
-
12-09-2019 - |
Вопрос
Я использую библиотеку Qt для показа слайд-шоу на втором мониторе, когда пользователь не использует второй монитор.Примером может служить пользователь, играющий в игру на первом мониторе и показывающий слайд-шоу на втором мониторе.
Проблема в том, что когда я открываю новое окно в Qt, оно автоматически перенимает фокус у предыдущего приложения.Есть ли способ предотвратить это?
Решение
Мне потребовалось некоторое время, чтобы найти это, но я нашел это: setAttribute(Qt::WA_ShowWithoutActivating);
Это заставляет окно не активироваться.Даже с Qt::WindowStaysOnTopHint
флаг
Другие советы
Если вы хотите создать плавающее окно предварительного просмотра/любой другой виджет, просто используйте ниже
thumbnail = new QLabel;
thumbnail->setAttribute(Qt::WA_ShowWithoutActivating);
thumbnail->setParent(0);
thumbnail->setWindowFlags(Qt::Tool | Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);
Qt::Tool — важный флаг, чтобы он работал.Я имею в виду не воровать фокус.
Виджеты по умолчанию не принимают фокус, но, вероятно, вы не создали простой виджет?Какой это был подкласс?QMainWindow или что-то еще?
Возможно, подклассы окон по умолчанию принимают фокус, поэтому попробуйте явно вызвать QWidget::setFocusPolicy с помощью Qt::NoFocus перед вызовом QWidget::show().
Кроме того, убедитесь, что вы ни в какой момент не вызываете QWidget::activateWindow() для окна или любого из его виджетов.