Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Qt] Focus évènement

Et évènements en général

29 avril 2008 à 11:52:38

Bonjour,
Voilà, je débute sur la librairie Qt et j'arrive à la gestion des évènements .
Voici mon application de test : 1 QlistWidget , 1 QlineEdit et 2 pushButtons
J'arrive a ajouter/supprimer le texte du lineEdit dans la listWidget par l'intermédiaire des évènements des pushbuttons et récupérer le texte de la liste lors d'un changement de sélection là pas de problème.

Maintenant j'aimerai gérer des évènements un peu plus avancés :
Par exemple la prise de focus d'un bouton puis afficher un message ou le passage au dessus d'un bouton et lui faire changer son label.J'ai regarder du coté du signal FocusChanged() pour le focus mais je sais pas du tout comment l'utiliser, j'ai fait plusieurs tests mais soit des erreurs soit ça ne fonctionne pas.

PS:Je code sous QDevelop avec Qt Designer comme assistant
[edit] dsl j'ai fait un double post :euh: [edit]
  • Partager sur Facebook
  • Partager sur Twitter
30 avril 2008 à 12:03:03

J'ai trouver des fonctions qui peuvent m'aider:
-QWidget::focusInEvent ( QFocusEvent * event )pour le focus sur un bouton
-void QWidget::mouseMoveEvent ( QMouseEvent * event ) pour le mouvement de la souris sur un bouton
Le problème c'est que se ne sont pas des SIGNAL mais des fonctions virtuelles. Je ne sais pas comment les utilisées pour intercepter les "event" pour effectuer un traitement ensuite.
Quelqu'un pourrait m'aider?
  • Partager sur Facebook
  • Partager sur Twitter
1 mai 2008 à 17:36:04

c'est des fonction membres donc a mon avis si ton bouton s'appele "bouton" tu doit faire

bouton.fonction(...);

donc utiliser un test conditionnel pour changer le texte
sa doit bien revoyer true ou false ^^
a voir dans la doc ...
  • Partager sur Facebook
  • Partager sur Twitter
2 mai 2008 à 9:54:48

En fait ce sont des fonctions que tu dois implémenter, donc tu fais hériter ta classe de la classe QT, et tu définies le comportement au click sur le bouton.

Exemple :

void TaClasse::focusInEvent(QFocusEvent *event)
{
    //Tes instructions lorsqu'on clique, tu peux regarder les classes d'Event, pour voir comment tu peux récuperer les infos de tes events etc.. Mais les actions doivent être définies ici.
}


Apres depuis cette fonction, en général tu as des if(event->méthode() == patati) uneFonction() else uneAutre() etc...
  • Partager sur Facebook
  • Partager sur Twitter
5 mai 2008 à 11:15:02

Bonjour et merci de vos réponses,
j'ai suivi vos conseils et j'ai trouvé quelques infos sur le net et je suis arrivé à un code qui ne fonctionne pas :lol: .Je pense pourtant que c'est la bonne méthode ...
Dans le .cpp :
Mes fonctions connect
MainWindowImpl::MainWindowImpl( QWidget * parent, Qt::WFlags f)
        : QMainWindow(parent, f)
{
    setupUi(this);
    connect(pushButton, SIGNAL(ihavethefocus()),this,SLOT(Focus()));

}

Aprés mes fonctions donc la fonction focusInEvent que j'implémente et la fonction Focus() pour les traitements:

void MainWindowImpl::focusInEvent(QFocusEvent * event )
{
    if (event->gotFocus()){//pourrait etre enlevé car c'est forcément du in
    	
        emit ihavethefocus();
   	}
    else{
    	event->ignore();
   	}

}

void MainWindowImpl::Focus()
{
    pushButton->setText("Focus");
    statusbar->showMessage("focus : ajouter ");
    QMessageBox::information(this, "BIP", "focus ajouter");
}


Dans le .h:
class MainWindowImpl : public QMainWindow, public Ui::MainWindow
{
    Q_OBJECT
public:
    MainWindowImpl( QWidget * parent = 0, Qt::WFlags f = 0 );
private slots:
    void Focus();
protected:
	virtual void focusInEvent(QFocusEvent * );
signals:
	void ihavethefocus();
};


Comme je l'ai dis , pas d'erreur mais rien ne se passe quand mon bouton prends le focus...

[edit]
Lors de l'execution j'ai :Object::connect: No such signal QPushButton::ihavethefocus() je pense que j'utilise mal la fonction connect() mais je vois pas où est mon erreur o_O
[edit2]
J'ai compris en fait ihavethefocus est un signal de MainWindowImpl, dans la fonction connect() en remplaçant "pushButton" par "this" plus d'erreur mais ca me détécte la prise de focus de la frame principale.
Comment faire la même chose pour un bouton? Lorsque mon bouton prend le focus exécuter la fonction Focus() que j'ai faite par exemple.
  • Partager sur Facebook
  • Partager sur Twitter
6 mai 2008 à 15:55:17

Bon voilà j'ai avancé , en fait il faut dériver une classe de QPushButton pour capter se type d'évènement (tout les évènements qui sont de type QMouseEvent QFocusEvent etc..,qui ne sont pas des signaux en bref)
Comme je travail avec Qt Designer et donc que je n'ai qu'un .ui je ne peux pas modifier le .h générer , donc je suis passé par "promote to" sur un pushButton une fonctionnalité de Qt Designer pour créer ma nouvelle classe (MonBouton).
Ca fait les includes et l'instance de mon bouton de type MonBouton dans le .ui mais ça ne génère pas le .h assosié (dommage :) )
Donc j'ai fait un monbouton.h que j'ai mis dans le dossier "build" et je la fait faire hérité de QPushButton. Dans le constructeur de MonBouton j'ai mis les mêmes arguments que pushButton (j'ai fait seulement ça pour l'instant après je suppose qu'il faudra que je rajoute mon signal et focusInEvent) mais j'ai des erreurs :

build\/ui_mainwindow.h:27: error: ISO C++ forbids declaration of `MonBouton' with no type


suivi d'un tas d'autres erreurs :-°

build\/ui_mainwindow.h:27: error: expected `;' before '*' token
build\/ui_mainwindow.h: In member function `void Ui_MainWindow::setupUi(QMainWindow*)':
build\/ui_mainwindow.h:38: error: `pushButton' undeclared (first use this function)
build\/ui_mainwindow.h:38: error: (Each undeclared identifier is reported only once for each function it appears in.)
build\/ui_mainwindow.h:38: error: `MonBouton' has not been declared
build\/ui_mainwindow.h: In member function `void Ui_MainWindow::retranslateUi(QMainWindow*)':
build\/ui_mainwindow.h:58: error: `pushButton' undeclared (first use this function)
mingw32-make.exe[1]: *** [build/moc_monbouton.o] Error 1
C:\MinGW3.2\bin\mingw32-make.exe: *** [release] Error 2


Si quelqu'un connait cette méthode "promote to" et peux m'expliquer...

PS: j'ai fait ma classe à la main et par l'assistant Qdevelop mais toujours la même erreur
  • Partager sur Facebook
  • Partager sur Twitter