在Qt中,QEvent是什么意思?失去窗口焦点、重新获得窗口焦点是什么意思?(设置透明度)

6

当我的应用程序失去焦点时,我需要设置透明度。

当其重新获得焦点(通过鼠标单击、alt-tab或其他方式)时,我还需要重置透明度。

我知道如何设置透明度,所以这不是问题:setWindowOpacity(0.75);

问题在于什么时候进行设置?


一个几乎的解决方案是使用enterEvent和leaveEvent,但这与焦点无关,只有当鼠标离开时才会触发。 - relipse
3个回答

5

我同意Kévin Renella的看法,QWidget::focusInEventQWidget::focusOutEvent有时会出现问题。相比之下,更好的方法是实现QWidget::changeEvent()

void MyQWidget::changeEvent(QEvent *event)
{   
    QWidget::changeEvent(event);
    if (event->type() == QEvent::ActivationChange)
    {
        if(this->isActiveWindow())
        {
            // widget is now active
        }
        else
        {
            // widget is now inactive
        }
    }
}

通过安装 event-filter,您也可以实现相同的功能。有关更多信息,请参阅Qt文档中的事件系统


1

当发生QFocusEvent事件时,只需重新实现即可。

void QWidget::focusInEvent ( QFocusEvent * event );
void QWidget::focusOutEvent ( QFocusEvent * event );

来自QWidget。确保在执行工作前或后始终调用超类方法。即,(在情况之前)

void Mywidget::focusInEvent (QFocusEvent * event ){
   QWidget::focusInEvent(event);
   // your code
}

但是,QWidget::focusInEventQWidget::focusOutEvent有时会出现问题。请参考答案以获取更可靠的方法。


类 DockStartStop :公共 QDockWidget - relipse

1
有时候会出现关于QWidget的focusInEvent和focusOutEvent事件的问题。
可以使用另一种方法,即使用QWidget::windowActivationChange(bool state)。如果为True,则表示您的小部件处于活动状态,否则为False。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接