Показать окно в Qt без кражи фокуса

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

Проблема в том, что когда я открываю новое окно в Qt, оно автоматически крадет фокус из предыдущего приложения. Есть ли способ предотвратить это?

3 ответа

Решение

Мне потребовалось некоторое время, чтобы найти это, но я нашел это: 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::activWindow() для окна или любого из его виджетов в любой точке.

Другие вопросы по тегам