我有以下問題:我有一個像應用程序的窗口一樣的「飛濺」,它有幾個按鈕用於打開最後一個項目,創建一個新的等...在按下時,這些按鈕隱藏窗口並完成這些操作。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 謝謝。
我已修復此問題。問題是,在隱藏了這個之後,我也做了一個setFlags ...並且當Qt :: SplashWindow標誌指定了QT內部的某個東西被破壞了,因爲它試圖給我的窗口的父窗口設置一些東西案件。也許這在更高版本中得到修復。不過感謝你推動我的方向。 – fritzone 2012-03-26 11:03:49