我已在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
并没有显示正常。
你可以选择它并单击它但它看起来不正常。
截屏:
感谢您的帮助
答案 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;
}
}
}