Seite 1 von 1

QLineEdit->selectAll() im EventFilter

Verfasst: 5. Januar 2012 20:32
von comm_a_nder
Hallo Gemeinde, ich habe folgenden Code:

Code: Alles auswählen

bool MainWindow::eventFilter(QObject *object, QEvent *event)
{
    if (object == ui->lineEditUrl)
    {
        if (event->type() == QEvent::FocusIn)
        {
            ui->lineEditUrl->selectAll(); /* funktioniert scheinbar nicht [1]*/
            QTimer::singleShot(0, object, SLOT(selectAll())); /* funktioniert */
        }
    }
    return false;
}
[1] funktioniert scheinbar nicht soll heißen: der Text wird komplett markiert (kann also unmittelbar danach mit selectedText() abgerufen werden, aber irgendwas danach macht das wieder zunichte, so dass der Text dann im Endeffekt wieder nicht mehr markiert ist. :/

Meine Fragen lautet nun:
  • Was zum Teufel passiert dann noch, dass die Markierung wieder weg geht?
  • Warum funktioniert der Aufruf über einen Timer?
  • Gibt es eine best practice, wie man das Problem lösen kann (Markieren des Textes wenn ein LineEdit den Fokus bekommt)?
  • Gibt es irgendwo in der Doku eine Stelle, wo ich nachlesen kann in welcher Reihenfolge welche Events wo abgearbeitet werden?
Danke und schönen Abend!

Re: QLineEdit->selectAll() im EventFilter

Verfasst: 6. Januar 2012 08:35
von brax
Qt Doku zu eventFilter hat geschrieben: 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.
Dein "return false;" weist Qt an, den Focus Event weiter zu verarbeiten. D.h. er kommt auch noch beim QLineEdit an, was dann wohl die Selektion wieder weg macht. Über den Timer funktioniert es, weil der erst feuert, wenn das aktuelle Event abgearbeitet ist. Also einfach "return true;", wenn es ein FocusInEvent ist, dann sollte es auch ohne den Timer klappen.

Edit: andererseits könnte das den unerwünschten Nebeneffekt haben, dass Dein QLineEdit gar nicht mehr den Fokus bekommt. Also mach vielleicht zur Sicherheit noch setFocus() auf dem QLineEdit, bevor Du die Selection setzt. Dann musst Du aber sicherstellen, dass es nicht zur endlosen Rekursion kommt (setFocus feuert wieder ein FocusInEvent!).