2012-03-21 103 views
2

我有以下問題:我有一個像應用程序的窗口一樣的「飛濺」,它有幾個按鈕用於打開最後一個項目,創建一個新的等...在按下時,這些按鈕隱藏窗口並完成這些操作。Linux下的QT窗口ActivationChange事件

與下面的代碼和標記創建了這個窗口:

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下 - 在CentOS 5.x的侏儒2.x和KDE 3.x和也是Windows ,所有有趣的版本)。最近,客戶端安裝了一些Fedora系統和Gnome 3,KDE 4等......突然間,應用程序表現得很有趣。當我按下按鈕來創建一個新項目時,它隱藏了啓動窗口,什麼也沒有發生。上面標有* *的行是負責人。看來,這些新的窗口管理器不按順序發送激活事件。

有沒有人有這方面的經驗?

(更多代碼可根據要求提供)。我們使用Qt 4.6.3 謝謝。

回答

2

您應該嘗試使用安裝在qApp上的事件篩選器的應用程序級別事件QEvent::ApplicationActivateQEvent::ApplicationDeactivate
當應用程序焦點發生更改或應用程序窗口最小化時會觸發這些事件。

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()上的所有其他部件的頂部的主窗口的一部分。

+0

我已修復此問題。問題是,在隱藏了這個之後,我也做了一個setFlags ...並且當Qt :: SplashWindow標誌指定了QT內部的某個東西被破壞了,因爲它試圖給我的窗口的父窗口設置一些東西案件。也許這在更高版本中得到修復。不過感謝你推動我的方向。 – fritzone 2012-03-26 11:03:49