2013-01-17 125 views
2

当我的应用程序失去焦点时,我需要设置透明度。 我还需要当它重新获得焦点(从鼠标点击或使用Alt-Tab或其他),QEvent意味着失去窗口焦点,重新获得窗口焦点? (设置透明度)

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

问题是什么时候?

+0

几乎解决方案是使用enterEvent和leaveEvent,但事不关己,重点只有当鼠标离开 – relipse

回答

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问题。看到这个answer更可靠的方法。

+0

错误:C2039:“focusInEvent”:不是“QWidget的” – relipse

+0

类DockStartStop成员:公共QDockWidget – relipse

1

有有时的QWidget

QWidget::focusInEventQWidget::focusOutEvent事件的问题有使用QWidget::windowActivationChange(bool state)替代。确实,你的小部件是活动的,否则为false。

2

我同意KévinRenella的看法,有时候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文档中的The Event System