QMainWindow больше не активное окно - PullRequest
4 голосов
/ 16 марта 2012

Я делаю простую игру с Qt, и я хотел бы приостановить игру, когда пользователь переключается на другое окно (это может быть путем его минимизации или случайного нажатия на окно рядом с ним и т. Д.).Моя игра обернута в QMainWindow, поэтому я хотел бы иметь возможность определять, когда она теряет фокус.

Я пробовал несколько разных методов для этого, но не увенчался успехом.Сначала я попытался перегрузить focusOutEvent QMainWindow, но этот метод вызывался только тогда, когда я впервые дал фокус окна с помощью setFocus.Я также попытался перегрузить метод события окна (QEvent *), чтобы проверить наличие QEvent :: ApplicationActive и QEvent :: ApplicationDeactivate.

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

Кто-нибудь знает хороший способ определить, потерял ли ваш QMainWindow фокус??

Ответы [ 3 ]

6 голосов
/ 16 марта 2012

Однажды у меня была похожая потребность, и я решил ее, перегрузив event(QEvent*) метод моего QMainWindow:

bool MyMainWindow::event(QEvent * e)
{
    switch(e->type())
    {
        // ...

        case QEvent::WindowActivate :
            // gained focus
            break ;

        case QEvent::WindowDeactivate :
            // lost focus
            break ;
        // ...
    } ;
    return QMainWindow::event(e) ;
}
1 голос
/ 16 марта 2012

Из документации -

Виджет обычно должен setFocusPolicy() к чему-то другому, чем Qt :: NoFocus для получения событий фокуса. (Обратите внимание, что прикладной программист может вызвать setFocus() на любом виджете, даже на которые обычно не принимают фокус.)

Из этой части документации , о focusPolicy -

Это свойство определяет способ, которым виджет принимает фокус клавиатуры.

Политика Qt::TabFocus, если виджет принимает фокус клавиатуры табуляция, Qt::ClickFocus, если виджет принимает фокус, нажав, Qt::StrongFocus, если он принимает оба, и Qt::NoFocus (по умолчанию), если он вообще не принимает фокус.

Вы должны включить фокусировку клавиатуры для виджета, если он обрабатывает клавиатуру События. Обычно это делается из конструктора виджета. За Например, конструктор QLineEdit вызывает setFocusPolicy (Qt::StrongFocus).

Так что настройте свою политику фокусировки соответствующим образом, я думаю, тогда вы получите соответствующие события фокусировки.

0 голосов
/ 14 марта 2015

Попробуйте QWidget::isActiveWindow().

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