2

EventFilter我已经在我的设备上安装了一个,QLineEdit这样我就可以处理焦点事件以允许 aQFileDialog显示它何时获得焦点。

我添加了以下几行:

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没有正常显示。您可以选择它并单击它,但它看起来不正常。截屏: 未正确显示的 QLineEdit 的屏幕截图

谢谢你的帮助

4

2 回答 2

7

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

在你重新实现这个函数时,如果你想过滤掉事件,即停止它被进一步处理,返回true;否则返回假。

但是有几点需要重新考虑:

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

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

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 );
}
于 2012-12-17T13:27:15.867 回答
1

对不起,但我知道我做错了什么。

在事件过滤器中,我需要添加一个返回 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;
        }
    }
}
于 2012-12-17T12:21:48.630 回答