【问题标题】:in Qt, what QEvent means loses window focus, regain window focus? (Set transparency)在 Qt 中,QEvent 意味着失去窗口焦点,重新获得窗口焦点? (设置透明度)
【发布时间】:2013-01-17 10:37:26
【问题描述】:

当我的应用程序失去焦点时,我需要设置透明度。 我还需要在重新获得焦点时重置透明度(通过鼠标单击或 alt-tab 或其他方式)

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

问题是什么时候?

【问题讨论】:

  • 一个几乎解决方案是使用enterEvent和leaveEvent,但这与鼠标离开时的焦点无关

标签: qt


【解决方案1】:

我同意 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 文档上的 The Event System

【讨论】:

    【解决方案2】:

    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 以获得更可靠的方法。

    【讨论】:

    • 类 DockStartStop : public QDockWidget
    【解决方案3】:

    QWidgetQWidget::focusInEventQWidget::focusOutEvent 事件有时会出现问题

    还有一个使用QWidget::windowActivationChange(bool state) 的替代方法。 True,您的小部件处于活动状态,否则为 false。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 2011-09-17
      相关资源
      最近更新 更多