Obtenez une notification/un événement / un signal lorsqu'un widget Qt se focalise

dans Qt, quand un widget reçoit focus, comment obtenir une notification à ce sujet, pour que je puisse exécuter du code personnalisé? Est-il un signal ou d'un événement?

22
demandé sur sashoalm 2008-11-26 21:16:52

8 réponses

Vous pouvez ajouter fr event filter.

Ceci est un exemple d'une application écrite avec QtCreator. Ce formulaire a un QComboBox combobox.


MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->comboBox->installEventFilter(this);
    .
    .
    .
}

bool MainWindow::eventFilter(QObject *object, QEvent *event)
{
    if (event->type() == QEvent::FocusOut)
    {
        if (object == ui->comboBox)
        {
            qWarning(object->objectName().toLatin1().data());
        }
    }
    return false;
}
34
répondu fat 2014-02-05 06:52:48

Qt Designer n'est pas conçu pour ce niveau de WYSIWYG de programmation.

le Faire en C++:

class LineEdit : public QLineEdit
{
    virtual void focusInEvent( QFocusEvent* )
    {}
};
10
répondu mxcl 2008-11-27 18:36:13

il y a un signal" focus changed " envoyé lorsque le focus change, introduit dans Qt 4.1.

Il a deux arguments, le widget perdant la mise au point et celui gagnant la mise au point:

void QApplication::focusChanged(QWidget * old, QWidget * now)
8
répondu Martin Beckett 2015-10-21 12:07:52

la manière la plus simple est de connecter une fente au signal QApplication::focus changed.

5
répondu 2008-12-02 14:43:54

il faudrait que je joue avec, mais en regardant la Documentation QT, il y a un "focusInEvent". C'est un gestionnaire d'événement.

Voici comment vous trouver des informations sur.... Ouvrez "Qt Assistant". Allez à L'Index. Mettez un "QLineEdit". Il y a un lien vraiment utile appelé "liste de tous les membres, y compris les membres hérités" sur toutes les pages de Widget. Cette liste est super, parce qu'elle a même les trucs hérités.

j'ai fait une recherche rapide pour "Focus" et j'ai trouvé tous les des choses liées à focus pour ce Widget.

2
répondu Bob 2008-11-26 18:30:06

Vous avez frappé de l'étrange se divise en QT, si vous regardez la documentation focusInEvent n'est pas un slot, c'est une fonction protégée, vous pouvez l'ignorer si vous êtes à la mise en œuvre d'une sous-classe de votre widget. Si vous voulez juste attraper l'événement entrant dans votre widget vous pouvez utiliser QObject::installEventFilter il vous permettra d'attraper toute sorte d'événements.

pour une raison étrange les développeurs de Trolltech ont décidé de propager des événements UI via deux avenues, signals / slots et QEvent

2
répondu Harald Scheirich 2008-11-28 21:10:51

juste au cas où quelqu'un cherche deux QMainWindow focus change . Vous pouvez utiliser

if(e->type() == QEvent::WindowActivate)
{
    //qDebug() << "Focus IN " << obj << e ;

}
1
répondu Yash 2016-02-24 11:17:20

QWidget::setFocus() est le slot, pas de signal. Vous pouvez vérifier si QLineEdit est en focus avec propriété focus. QLineEdit émet des signaux lorsque le texte est modifié ou édité, voir documentation.

0
répondu 2008-11-27 01:19:10