[Interest] Finish QLineEdit editing when user clicks anywhere outside the QLineEdit

Henry Skoglund henry at tungware.se
Tue Aug 13 20:58:32 CEST 2019


Hi, had a similar problem, couldn't find any other solution than using 
an event filter, but it turned out being not so bad, made a small class:

#include "qevent.h"

class MouseFilter : public QObject
{
     Q_OBJECT

     QWidget* pW;  // ptr to widget to check for inside/outside mouse clicks

     bool eventFilter(QObject* pObj, QEvent* pEvent)
     {
         if (QEvent::MouseButtonPress == pEvent->type())
         {
             QMouseEvent* pME = static_cast<QMouseEvent*>(pEvent);

             QRect 
r(pW->mapToGlobal(QPoint(0,0)),pW->mapToGlobal(QPoint(pW->width(),pW->height())));
             bool bClickOutside = !r.contains(pME->globalPos());
             qDebug << bClickOutside;
         }

         return QObject::eventFilter(pObj,pEvent);
     }

public:
     void setWidget(QWidget* pW)
     {
         this->pW = pW;
     }
};

In my MainWindow I have an instance of that class, and in MainWindows's 
ctor I initialize it:

MouseFilter mf;
...
mf.setWidget(ui->lineEdit);
qApp->installEventFilter(&mf);
...


Rgrds Henry


On 2019-08-13 16:47, Murphy, Sean wrote:
> I'm trying to create a custom QLineEdit where while editing, the user can click anywhere *outside* the QLineEdit to finish editing.
>
> The default QLineEdit behavior appears to be that once the user has clicked inside the QLineEdit and begins editing the text, if the user then clicks on some other widget that *will* accept focus via a mouse click, the editing finished signal is emitted and the cursor/focus moves to whatever they clicked on. What I'm struggling with is that if the user clicks on something that *doesn't* normally accept focus via a mouse click, like any whitespace in my app, the cursor stays within the QLineEdit and editing is still active.
>
> I thought maybe I could use focusOutEvent(), but in the case where the user clicks on whitespace, the QLineEdit doesn't receive a focusOutEvent(). So that doesn't appear to be useful, unless I'm missing something.
>
> Ideally I want a solution that is completely contained within my custom QLineEdit-inherited class - with all the other widgets unaware that this behavior is happening. The only solution I'm finding via Google is doing things like installing event filters or setting the focus policy on other widgets to then force the QLineEdit to give up focus or end editing.
>
> Sean
>



More information about the Interest mailing list