gpt4 book ai didi

qt - 将 eventfilter 添加到 QLineEdit 会改变它的外观

转载 作者:行者123 更新时间:2023-12-02 07:05:00 25 4
gpt4 key购买 nike

我在我的 QLineEdit 上安装了一个 EventFilter,这样我就可以处理焦点事件以允许 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

谢谢你的帮助

最佳答案

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

In your reimplementation of this function, if you want to filter the event out, i.e. stop it being handled further, return true; otherwise return false.

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

  • 您的代码包含不包含 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 );
}

关于qt - 将 eventfilter 添加到 QLineEdit 会改变它的外观,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13914043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com