将eventfilter添加到QLineEdit会改变其外观

时间:2012-12-17 12:18:51

标签: qt

我已在EventFilter上安装了QLineEdit,以便我可以处理焦点事件,以便QFileDialog显示何时获得焦点。

我添加了以下几行:

QLineEdit *projDir = new QLineEdit();

然后我进一步向下:

projDir->installEventFilter(this)

这是我的功能:

bool StartDialog::eventFilter(QObject *target, QEvent *event)
{
    if(target == projDirEdit )
    {
        if (event->type() == QEvent::FocusIn)
        {
            qDebug()<<"yep";
        }
        else
            event->ignore();
    }
}

但由于某种原因,当我有这个过滤器时,实际的QLineEdit并没有显示正常。 你可以选择它并单击它但它看起来不正常。 截屏: Screenshot of the QLineEdit which isnt displaying properly

感谢您的帮助

2 个答案:

答案 0 :(得分:7)

根据Qt文档,您的回答中的return true/false语句是正确的:

  

在重新实现此功能时,如果要过滤掉事件,即停止进一步处理,请返回true;否则返回false。

然而,有几点需要重新考虑:

  • 您的代码包含不包含return语句的代码路径:如果目标不是projDirEdit,或者事件不是FocusIn,将返回什么?真正?假<?/ LI>
  • 如果你不关心它,你不应该ignore()这个事件,因为这可能意味着其他课程将不再处理这个事件。
  • 如果要过滤掉多个事件,则使用开关()作为事件类型可以更轻松地扩展。

就个人而言,我会这样实现:

bool StartDialog::eventFilter(QObject *target, QEvent *event)
{
    if( target == projDirEdit )
    {
        switch( event->type() )
        {
        case QEvent::FocusIn:
        case QEvent::FocusOut:  // I added this as an example why I use switch()
            event->ignore(); // not sure if this is necessary
            return true;
        default:
            break;
        };
    }

    // let the base class handle anything else
    // (assuming QFileDialog is the base class)
    return QFileDialog::eventFilter( target, event );
}

答案 1 :(得分:1)

抱歉,但我弄清楚我做错了什么。

在eventfilter中我需要添加一个返回false并返回true。我不确定这是否正确,但它解决了我的问题:

    bool StartDialog::eventFilter(QObject *target, QEvent *event)
{
    if(target == projDirEdit )
    {
        if (event->type() == QEvent::FocusIn)
        {
            qDebug()<<"yep";
            return true;
        }
        else
        {
            event->ignore();
            return false;
        }
    }
}