我遇到以下问题:我的应用程序附带一个类似“飞溅”的窗口,上面有一些按钮,用于打开上一个项目、创建新项目等...按下后,这些按钮会隐藏窗口并做一些事情。
此窗口是使用以下代码和标志创建的:
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 上的 Gnome 2.x,以及 KDE 3.x 和 Windows,所有有趣的版本)。最近客户端安装了一些 Fedora 系统和 Gnome 3、KDE 4 等......突然应用程序表现得很有趣。当我按下按钮创建一个新项目时,它会隐藏启动窗口并且没有任何反应。上面标有 ** 的行是负责的行。这些新的窗口管理器似乎无序发送激活事件。
有人有这方面的经验吗?
(可根据要求提供更多代码)。我们使用Qt 4.6.3 谢谢。
最佳答案
您应该尝试应用程序级别事件 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()
将启动窗口显示为主窗口的一部分,位于所有其他小部件之上。 .
关于linux下QT窗口ActivationChange事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9813555/