2012-03-21 6 views
2

다음과 같은 문제가 있습니다. 응용 프로그램과 함께 "시작"창이 나타나고 마지막 프로젝트를 열어 새 프로젝트를 만드는 등의 버튼이 몇 개 있습니다. 누르는 동안,이 버튼들은 창을 숨기고 물건들을합니다.QT window 리눅스에서의 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); 
} 

: 이것은 다음과 같은 코드에 의해 이루어집니다 위의 코드는 모두 리눅스에서 (지금까지 완벽하게 작동 -에 CentOS 5.x의에 그놈 2.X 및 KDE 3.x 및도 윈도우 , 모든 흥미있는 버전). 최근에 클라이언트가 몇몇 Fedora 시스템과 Gnome 3, KDE 4 등을 설치했습니다 ... 갑자기 응용 프로그램이 재미있게 작동합니다. 새 프로젝트를 만들기 위해 단추를 누르면 시작 창이 숨겨지고 아무 일도 일어나지 않습니다. 위의 * *으로 표시된 줄이 담당합니다. 이러한 새로운 창 관리자가 활성화 이벤트를 순서대로 보내지 않은 것으로 보입니다.

누구에게 경험이 있습니까?

(요청시 추가 코드 제공). 우리는 Qt 4.6.3 감사를 사용합니다.

답변

2

응용 프로그램 레벨 이벤트 QEvent::ApplicationActivateQEvent::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()을 사용하여 모든 다른 위젯의 상단에있는 메인 윈도우의 일환으로 시작 창을 표시 할 수 있습니다.

+0

이 문제를 해결했습니다. 문제는이 숨기기 후 또한 setFlags 않았다 ... 그리고 놀랍게도 Qt :: SplashWindow 플래그가 지정되었을 때 QT 내에서 무언가가 깨졌을 때, 내 부모에서 0 인 부모를 설정하려고했기 때문에 문제가 발생했습니다. 케이스. 어쩌면이 문제는 이후 릴리스에서 수정 될 수 있습니다. 그러나 당신이 나를 밀 쳤던 방향에 감사드립니다. – fritzone