Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 将eventfilter添加到QLineEdit会更改其外观_Qt - Fatal编程技术网

Qt 将eventfilter添加到QLineEdit会更改其外观

Qt 将eventfilter添加到QLineEdit会更改其外观,qt,Qt,我已经在我的QLineEdit上安装了EventFilter,这样我就可以处理焦点事件,以便在获得焦点时显示QFileDialog 我添加了以下行: QLineEdit *projDir = new QLineEdit(); 再往下看,我有: projDir->installEventFilter(this) 这是我的职责: bool StartDialog::eventFilter(QObject *target, QEvent *event) { if(target ==

我已经在我的
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();
    }
}
bool StartDialog::eventFilter(QObject*target,QEvent*event)
{
如果(目标==projDirEdit)
{
如果(事件->类型()==QEvent::FocusIn)
{

qDebug()对不起,我知道我做错了什么

在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;
        }
    }
}
bool StartDialog::eventFilter(QObject*target,QEvent*event)
{
如果(目标==projDirEdit)
{
如果(事件->类型()==QEvent::FocusIn)
{

qDebug()根据Qt文档,您答案中的
返回真/假
语句是正确的:

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

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

  • 代码包含的代码路径不包含
    return
    语句:如果目标不是projDirEdit,或者事件不是FocusIn,将返回什么?True?False
  • 如果不关心事件,就不应该
    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 );
}