web-dev-qa-db-fra.com

Obtenir une notification/événement/signal lorsqu'un widget Qt devient actif

Dans Qt, lorsqu'un widget reçoit le focus, comment peut-il recevoir une notification à ce sujet afin que je puisse exécuter du code personnalisé? Y a-t-il un signal ou un événement pour cela?

22
Luis Navarro

Vous pouvez ajouter en event filter.
Voici un exemple d'application écrite avec QtCreator . Ce formulaire a QComboBox named 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
user242144

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

Faites-le en C++:

class LineEdit : public QLineEdit
{
    virtual void focusInEvent( QFocusEvent* )
    {}
};
10
mxcl

Un signal "focusChanged" est envoyé lorsque la focalisation change, introduit dans Qt 4.1.
Il a deux arguments, le widget qui perd le focus et celui qui gagne le focus:

void QApplication::focusChanged(QWidget * old, QWidget * now)
9
Martin Beckett

Le moyen le plus simple consiste à connecter un emplacement au signal QApplication :: focusChanged.

5
Roberto Alsina

Vous avez touché à des fractionnements étranges dans QT. Si vous consultez la documentation, focusInEvent n’est pas un emplacement, il s’agit d’une fonction protégée. Vous pouvez la remplacer si vous implémentez 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 permet d’attraper tout type d’événement. 

Pour une raison quelconque, les développeurs de Trolltech ont décidé de propager les événements d'interface utilisateur via deux avenues, signaux/slots et QEvent

2
Harald Scheirich

Je devrais jouer avec, mais en regardant la documentation QT, il y a un "focusInEvent". Ceci est un gestionnaire d'événement.

Voici comment vous trouvez des informations sur .... Ouvrez "QT Assistant". Allez à l'index. Mettez dans un "QLineEdit". Il existe un lien très utile appelé "Liste de tous les membres, y compris les membres hérités" sur toutes les pages du widget. Cette liste est excellente, car elle contient même les éléments hérités.

J'ai fait une recherche rapide pour "Focus" et j'ai trouvé toutes les informations relatives à la focalisation de ce widget.

2
Bob

Juste au cas où quelqu'un cherche deux focus QMainWindow changer. Vous pouvez utiliser 

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

}
1
Yash

QWidget :: setFocus () est une fente, pas un signal. Vous pouvez vérifier si QLineEdit est actif/avec la propriété focus . QLineEdit émet des signaux lorsque le texte est modifié ou modifié, voir la documentation.

0
minimoog