Событие ActivationChange окна QT под Linux - PullRequest
2 голосов
/ 22 марта 2012

У меня есть следующая проблема: у меня есть приложение, похожее на «всплеск», которое идет с моим приложением, и на нем есть несколько кнопок для открытия последнего проекта, создания нового и т. Д. ... При нажатии эти кнопки скрываютсяокно и делать вещи.

Это окно создается со следующим кодом и флагами:

void MainWindowButtonDialog::showMe()
{
    setModal(false);
    setWindowFlags(Qt::SplashScreen | Qt::CustomizeWindowHint |
                      Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint);
    show();
}

Окно называется m_btnDlg.

Теперь, из-зана запросы клиентов, когда приложение теряет фокус, мне нужно скрыть это окно, а когда приложение получает фокус, мне нужно снова показать его.Это делается с помощью следующего кода:

void MainWindow::changeEvent(QEvent *e)
{
    if( e->type() == QEvent::WindowStateChange )
    {
        if( isMinimized() )
        {
            if(m_btndlg && m_btndlg->isVisible())
            {
                m_btndlg->hide();
                m_splashWasVisible = true;
            }
        }
        else
        {
            if(m_splashWasVisible)
            {
                m_btndlg->show();
                m_splashWasVisible = false;
            }
        }
    }
    if(e->type() == QEvent::ActivationChange)
    {
        if(!isActiveWindow())
        {
            if(m_btndlg && m_btndlg->isVisible() && !m_btndlg->isActiveWindow())
            {
                m_btndlg->hide(); // *****
                m_splashWasVisible = true;
            }
        }
        else
        {
            if(m_splashWasVisible)
            {
                m_btndlg->show();
                m_splashWasVisible = false;
            }
        }
    }
    QMainWindow::changeEvent(e);
}

Теперь к проблеме: приведенный выше код до сих пор работал отлично (как под Linux - Gnome 2.x на CentOS 5.x, так и KDE 3.x итакже винда, все интересные версии).Недавно клиент установил несколько систем Fedora и Gnome 3, KDE 4 и т. Д. ... внезапно приложение ведет себя странно.Когда я нажимаю кнопку, чтобы создать новый проект, он скрывает окно-заставку, и ничего не происходит.Ответственна строка, помеченная ** выше.Кажется, что эти новые оконные менеджеры отправляют события активации не по порядку.

Кто-нибудь сталкивался с этим?

(дополнительные коды доступны по запросу).Мы используем Qt 4.6.3 спасибо.

1 Ответ

2 голосов
/ 22 марта 2012

Вы должны попробовать события уровня приложения QEvent::ApplicationActivate и QEvent::ApplicationDeactivate с фильтром событий, установленным в qApp.
Эти события генерируются, когда фокус приложения изменяется или окно приложения свернуто.

MainWindow::MainWindow() {
  qApp->installEventFilter(this);
}

bool MainWindow::eventFilter(QObject *obj, QEvent *evt)
{
    if(obj==qApp && ( evt->type() == QEvent::ApplicationActivate
                      || evt->type() == QEvent::ApplicationDeactivate))
    {
        bool shouldHide = evt->type() == QEvent::ApplicationDeactivate;
        if (shouldHide) {
            m_splashWasVisible = m_btndlg && m_btndlg->isVisible();
            if(m_splashWasVisible) 
                m_btndlg->hide();
        } else {
            if(m_splashWasVisible) 
                m_btndlg->show();
        }    
    }
    return QMainWindow::eventFilter(obj, evt);
}

В качестве альтернативы, вы можете отобразить всплывающее окно как часть основного окна поверх всех других виджетов, установивглавное окно в качестве его родителя, используя QWidget::raise().

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