linux下QT窗口ActivationChange事件

标签 qt event-handling window activation

我遇到以下问题:我的应用程序附带一个类似“飞溅”的窗口,上面有一些按钮,用于打开上一个项目、创建新项目等...按下后,这些按钮会隐藏窗口并做一些事情。

此窗口是使用以下代码和标志创建的:

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::ApplicationActivateQEvent::ApplicationDeactivateqApp上安装了事件过滤器。
当应用程序焦点更改或应用程序窗口最小化时,将触发这些事件。

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/

相关文章:

qt - QString 和嵌入式 Null

ffmpeg - 如何使用 ffmpeg 记录特定窗口?

window - 禁用 GLFW 窗口上的关闭按钮

qt - 为 Pandaboard 交叉编译 Qt

c++ - 使用Bazel生成QT资源文件

qt - 无法 cmake kde-connect

c++ - 编辑框闪烁

ios - 当 UITableViewController 的子类包含在 subview 中时,它不会触发 didSelectRowAtIndexPath,我该如何解决这个问题?

event-handling - 无法捕获 NestJs 中的事件

jquery - 确定事件之外的鼠标位置(使用 jQuery)?