【问题标题】:QT window ActivationChange event under linuxlinux下QT窗口ActivationChange事件
【发布时间】:2023-03-28 17:13:01
【问题描述】:

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

这个窗口是用以下代码和标志创建的:

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 谢谢。

【问题讨论】:

    标签: qt event-handling window activation


    【解决方案1】:

    您应该尝试在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(),将启动窗口作为主窗口的一部分显示在所有其他小部件之上。

    【讨论】:

    • 我已经解决了这个问题。问题是,在隐藏这个之后,我还做了一个 setFlags ......令人惊讶的是,当 Qt::SplashWindow 标志被指定时,QT 内部的某些东西被破坏了,因为它试图为窗口的父级设置一些东西,在我的窗口中是 0案子。也许这在以后的版本中已修复。不过谢谢你推我的方向。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多