Aller au menu - Aller au contenu

Les signaux et les slots

Pour accéder à cette section
Connectez-vous !
connexion_rpx
Page Précédente  1  2  3 
Pseudo Commentaire
Page Précédente  1  2  3 
Hors ligne wa3dbk # Posté le 07/06/2011 à 19:31:31
Avatar

Dans le cas ou vous ayez le même problème, il suffisait de faire:
Compiler -> Executer qMake
Puis recompiler le projet :)
Hors ligne Wakyo # Posté le 23/06/2011 à 23:16:30

Ville : Dry
Pays : France métropolitaine

Bonjour, je ne sais pas si qqun pourra m'aider mais je test quand même ! ;)

J'ai exécuté le tuto au fur et à mesure mais quand j'en suis arrivé au niveau d'ajouter le bouton "about" à la fenêtre précédemment créée, la compilation se faisait bien mais l’exécutable se fini avec le code -1073741819. Aucune fenêtre n'est ouverte. :colere2:

J'ai pourtant fait un copier coller de ce qu'il y a écrit pour vérifier. Par la suite je me suis attaqué à ce qu'il y a juste après et le même code d'erreur s'affiche. Je sais plus quoi faire ...

Merci d'avance ! :D


EDIT : J'ai trouvé la réponse sur le forum en continuant de chercher ... Il suffit de recompiler tout le projet. Apparement un fichier n'as pas été bien compilé.
Hors ligne harold44 # Posté le 04/08/2011 à 17:01:59

Avis : Bon

Une question, si j'ai bien compris:
SIGNAL(int)->SlOT(int).
Etc...
Comment on fait si on veut lors d'un click mettre une valeur dans un progressbar par exemple.
SIGNAL(click())->SlOT(int).
Si quelqu'un avait la réponse ce serait sympas...
Hors ligne harold44 # Posté le 08/08/2011 à 22:19:48

Avis : Bon

Pourriez vous mettre une solution pour la création de signal.
Merci pour ce cours, c'est vraiment sympas.
Hors ligne Aaal1811 # Posté le 13/08/2011 à 19:28:12

Salut, je pense en effet qu'un exemple de signal envoyant une valeur ne serait pas de refus, j'ai encore du mal avec ça ^^

edit : après une recherche de 5 minutes, j'ai en fait trouvé la solution :D
Dans le header :
Code : C++
1
2
3
4
5
6
7
8
9
class nomDeLaClasse : public QObject //ou classe héritée de QObject sinon on ne peut pas créer de signaux ou de slots
{
  Q_OBJECT //Ne pas oublier !

//...
signals:
  void MonSignal(type1, type2, ...); //On ne défini que le type des paramètres qui seront envoyés
//...
}


Et dans le .cpp :
Code : C++
1
2
3
4
5
6
7
8
type nomDeLaClasse::uneFonction(arguments) //Fonction quelconque dans laquelle on veut envoyer le signal
{
  type1 variable1;
  type2 variable2;
//...
  emit monSignal(variable1, variable2, ...); //On place directement les paramètres à envoyer, du type prédéfini dans le .h
//...
}


Sinon
Citation : harold44
Une question, si j'ai bien compris:
SIGNAL(int)->SlOT(int).
Etc...
Comment on fait si on veut lors d'un click mettre une valeur dans un progressbar par exemple.
SIGNAL(click())->SlOT(int).
Si quelqu'un avait la réponse ce serait sympas...


Je pense que le mieux est de créer un slot personnalisé :

Code : C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
//Dans le header :
private slots:
  void modifierValeurProgressBar();

//Dans le corps :
  //Dans le constructeur, où tu fais les connexions :
  QObject::connect(tonPushButton, SIGNAL(clicked()), this, SLOT(modifierValeurProgressBar()));

  //Le slot :
  void taClasse::modifierValeurProgressBar()
  {
    int valeur = ... //Récupère la valeur d'où tu veux la récupérer
    //Par exemple si ça vient d'une spinBox de l'ui (fait avec QtDesigner) :
    //int valeur = ui->maSpinBox->value();
    //Ou si c'est un attribut de ta classe :
    //int valeur = m_monAttributAMoi;
    taProgressBar.setValue(int valeur);
  }


Voilà j'espère que cela vous aura aidé ;)
Hors ligne R-transat # Posté le 21/08/2011 à 13:47:39
Avatar

Citation : wa3dbk
Dans le cas ou vous ayez le même problème, il suffisait de faire:
Compiler -> Executer qMake
Puis recompiler le projet :)


Et comment ça se fait qu'il faut faire ça ?
Hors ligne Aaal1811 # Posté le 22/08/2011 à 12:05:43

La macro Q_OBJECT nécessite un qmake chaque fois que tu l'intègres à un nouveau fichier.
Hors ligne voblivion # Posté le 28/08/2011 à 21:45:23
Avatar

Merci pour ce renseignement ! peut-être serait-il judicieux de le préciser clairement dans le tuto ? car j'ai beau avoir lu et relu, il m'a fallu passer ici pour trouver la solution ;)

Visitez mon site, et venez participer à son recensement:

http://partoutab.alwaysdata.net

Pensez à valider les sujets lorsqu'ils sont résolus !
 
Hors ligne ZAZDI # Posté le 22/09/2011 à 15:11:09
Be a good person
Avatar

Salut les Zéros :) ,dans la section de créer nos propres slots et signaux ,j'ai compiler les projets avec succé sans que j'ai fait un qmake ,seulement un clic sur le fleche vert en Qt Creator ,quelqu'un peut nous expliquer la belle phénomène :)

Mon livre mathématique préféré: Les Maths en tete
 
Hors ligne Innocenti # Posté le 02/11/2011 à 19:18:59

MaFenetre.h
Code : C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#ifndef DEF_MAFENETRE
#define DEF_MAFENETRE

#include <QApplication>
#include <QWidget>
#include <QSlider>

class MaFenetre : public QWidget
{
    Q_OBJECT

    public:
    MaFenetre();

    public slots:
    void changerLargeur(int largeur);
    void changerHauteur(int hauteur);

    private:
    QSlider *m_sliderL;
    QSlider *m_sliderH;
};

#endif


MaFenetre.cpp
Code : C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include "MaFenetre.h"


MaFenetre::MaFenetre() : QWidget()
{
    setFixedSize(200, 100);

    m_sliderL = new QSlider(Qt::Horizontal, this);
    m_sliderL->setRange(200, 600);
    m_sliderL->setGeometry(10, 60, 150, 20);

    m_sliderH = new QSlider(this);
    m_sliderH->setRange(100, 600);
    m_sliderH->setGeometry(150, 10, 20, 50);

    QObject::connect(m_sliderL, SIGNAL(valueChanged(int)), this, SLOT(changerLargeur(int)));
    QObject::connect(m_sliderH, SIGNAL(valueChanged(int)), this, SLOT(changerHauteur(int)));
}


void MaFenetre::changerLargeur(int largeur)
{
    setFixedSize(largeur, this->height()); // this = MaFenetre fenetre;
}

void MaFenetre::changerHauteur(int hauteur)
{
    setFixedSize(this->width(), hauteur); // this = MaFenetre fenetre;
}


main.cpp
Code : C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <QApplication>
#include "MaFenetre.h"


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MaFenetre fenetre;
    fenetre.show();

    return app.exec();
}


Je n'ai pas pensé à this tout de suite ^^
Hors ligne Cynn1608 # Posté le 17/11/2011 à 00:45:51

Bonsoir, voila je commence tout juste à utilisé Qt et lorsque je rentre le code où l'on veut faire apparaitre deux boutons ( Quitter et A propos ) et que je compile , aucune fenêtre ne s'ouvre et il me dit : "Le programme s'est terminé subitement."

Merci de votre aide.
Hors ligne rob9782 # Posté le 03/12/2011 à 10:11:34
Avatar

Avis : Très bon

Bonsoir,j'ai une erreur un peu bête....

Au moment ou l'on doit utiliser les slider,j'ai copier coller le code de matheo, mais lorsque je compile il me dit:

request for member 'show' in 'Fenetre', which is of non-class type 'MaFenetre()' o_O

pourtant j'ai fait comme le demandais matheo
Code : C++
1
2
MaFenetre Fenetre();
Fenetre.show();


Il m'indique la ligne du
"Fenetre.show()"

Merci.

90% of teens today would die if Facebook was completely destroyed. If you are one of the 10% that would be laughing, copy and paste this to your signature.
 
Hors ligne grimpeur # Posté le 23/12/2011 à 18:35:36

@cinn1608
tes sur quel OS parce que moi chui sur Lion en 64 bits et ca me fé la même chose dès que j'y mets le 2eme objet, les 1er objet marche mé pas le 2eme
Hors ligne Shill # Posté le 30/12/2011 à 06:59:01

Avis : Très bon

@Cynn1608
@grimpeur

J'ai eu ce même problème et, plusieurs cheveux en moins, j'ai finalement trouvé un sujet où quelqu'un avait déjà répondu à cette question. :colere2:

Le solution (du moins, pour moi) est de « nettoyer » le projet. Il suffit de cliquer sur l'onglet « compiler » puis sur «Nettoyer le projet "nomDeVotreProjet".

Bonne chance ;)
Hors ligne Arnaud921 # Posté le 11/01/2012 à 22:33:25

Citation : rob9782
Bonsoir,j'ai une erreur un peu bête....

Au moment ou l'on doit utiliser les slider,j'ai copier coller le code de matheo, mais lorsque je compile il me dit:

request for member 'show' in 'Fenetre', which is of non-class type 'MaFenetre()' o_O

pourtant j'ai fait comme le demandais matheo
Code : C++
1
2
MaFenetre Fenetre();
Fenetre.show();


Il m'indique la ligne du
"Fenetre.show()"

Merci.


C'est parce que dans ton fichier main.cpp tu as créer l'objet fenetre avec des parenthèses alors que le constructeur n'est censé prendre aucune valeur :) donc tu as juste a enlevé les parenthèses, comme ceci : MaFenetre fenetre;
C'est sur c'est assez bete mais faut y penser ! Jme suis fait avoir aussi j'ai bloqué 10 mn mdr'
voila (:
Hors ligne -Dr3ck- # Posté le 14/01/2012 à 18:17:47
///Testostérone\\\
Avatar

Bonjour,, étant habitué à Code::Blocks, je suis un peu perdus sur Qt Créator, je conçois que ma question est très bête, mais, quand on créé nos propres slots, les commandes qmake make on les marque ou ?

U MAD BRO ? Image utilisateur
 
Hors ligne cardman # Posté le 28/01/2012 à 20:20:50

Avis : Très bon

Ville : Condécourt
Pays : France métropolitaine

Je mets 20/20 à ce tuto,
car il montre tous les cas d'utilisation des signaux et des slots,
ce tutoriel m'a permis de progresser pour l'interface graphique.

En JAVA, la gestion de l'ihm avec les événements est plus complexe.

François Mercier des Rochettes.
 
Hors ligne yb36 # Posté le 07/02/2012 à 00:38:47

Études : INSA Toulouse

Bonjour à tous

Je ne sais pas si j'ai le droit de poster ici mais je suis au niveau de creer son propre slot. Tout fonctionne très bien si je ne crée pas de nouveau slot. Mais des que je rajoute ma fonction Slot ca me met une erreur de lien :

MaFenetre.obj:-1: erreur : LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall Fenetre::metaObject(void)const " (?metaObject@Fenetre@@UBEPBUQMetaObject@@XZ)

Est ce que quelqu'un sait d'ou cela peut provenir ?
Hors ligne Maghim # Posté le 10/02/2012 à 19:56:36
Un verre est toujours plein ^^
Avatar

Avis : Très bon

Très bon tuto mais j'ai un petit problème ^^
Dans le tuto, il est question de "macro".
Mateo ne l'a jamais expliqué avant.
Qu'est ce que "macro"?

Citation : Henri Michaux
« Toute science crée une nouvelle ignorance. »
 
Hors ligne esteb45 # Posté le 12/02/2012 à 10:57:53

Ville : Orléans
Pays : France métropolitaine

Bonjour,
J'ai un problème dans l'exercice de la partie :"Des paramètres dans les signaux et slots"
J'ai fait tout ce qui était demandé mais en plus de la progressbar, quand j'appuye sur le bouton, je voudrais réinitialiser le slider aussi. J'ai donc cherché dans la doc et trouvé un slot hérité de QAbstractslider : setValue
J'ai donc les deux connections suivantes :

QObject::connect(bouton, SIGNAL(clicked()), m_barre, SLOT(reset()));
QObject::connect(bouton, SIGNAL(clicked()), m_slider, SLOT(setValue(0)));

Cependant ça ne réinitialise que la progressbar le slider ne bouge pas, que faut-il faire ?
Merci :)
Hors ligne Aaal1811 # Posté le 22/02/2012 à 23:01:44

Citation : Maghim
Mateo ne l'a jamais expliqué avant.
Qu'est ce que "macro"?


http://www.siteduzero.com/tutoriel-3-1 [...] tml#ss_part_3

Comme quoi apprendre aussi le C n'est pas inutile ;)

Citation : esteb45
QObject::connect(bouton, SIGNAL(clicked()), m_barre, SLOT(reset()));
QObject::connect(bouton, SIGNAL(clicked()), m_slider, SLOT(setValue(0)));

Cependant ça ne réinitialise que la progressbar le slider ne bouge pas, que faut-il faire ?


Je crois que c'est incompatible, le plus simple serait de créer un slot perso que tu connecte à ton clicked() et donc le corps serait juste
Code : C++
1
2
3
4
void reinitialiserSlider()
{
   m_slider->setValue(0) //remplacer -> par . si m_slider n'est pas un pointeur
}
Hors ligne esteb45 # Posté le 29/02/2012 à 12:23:05

Ville : Orléans
Pays : France métropolitaine

Salut,

Je ne comprends pas pourquoi pour les slots personnalisés il faut renvoyer un pointeur vers la fenêtre(this) alors que pour les slots classiques il faut un pointeur vers le widget concerné.

Faut-il mettre this pour tous les slots personnalisés ?
Hors ligne .nicoloco. # Posté le 29/02/2012 à 20:55:42
Avatar

Avis : Bon

J'ai un problème concernant MaFenetre.h :

Quand je compile avec seulement m_quitter cela marche mais quand je met m_quitter et m_aPropos le programme plante (La compilation marche mais au lancement on m'indique : test.exe a rencontré un problème et doit fermer.Nous vous prions de nous excuser pour le désagrément encouru (Fenêtre avec les bouton : envoyer et ne pas envoyer)

Se n'est pas en tapant sur une machine qu'elle va réagire.
.nicoloco.
 
Hors ligne Aaal1811 # Posté le 29/02/2012 à 22:29:11

Citation : esteb45
Salut,

Je ne comprends pas pourquoi pour les slots personnalisés il faut renvoyer un pointeur vers la fenêtre(this) alors que pour les slots classiques il faut un pointeur vers le widget concerné.

Faut-il mettre this pour tous les slots personnalisés ?


Oui, il faut que tu donne un pointeur dans lequel le slot a été déclaré, et en général c'est dans le même widget qu'il a été déclaré et qu'il est connecté.
Hors ligne lio2609 # Posté le 12/03/2012 à 17:25:03

Avis : Bon

Bonjour,

J'ai le meme probleme que .nicoloco .
J'ai pourtant, copié/collé le code et rajouté les lignes correspondantes dans le header.

Une solution?

"Ce n'est pas parce qu'ils sont beaucoup à avoir tort qu'ils ont raison" Michel Colucci.
 
Hors ligne masmas42 # Posté le 02/04/2012 à 11:14:45

Bonjour à tous les zéros,

je vous explique mon petit problème

lorsque je compile avec seulement m_quitter cela marche
lorsque je compile avec seulement m_aPropos cela marche

Mais lorsque je compile avec les deux, La sortie de l'application m'indique:

Démarrage de D:\Qt\test-build-desktop-Qt_4_8_0_for_Desktop_-_MinGW__Qt_SDK__Debug\debug\test.exe...Le programme s'est terminé subitement.
D:\Qt\test-build-desktop-Qt_4_8_0_for_Desktop_-_MinGW__Qt_SDK__Debug\debug\test.exe a quitté avec le code -1073741819


je vous remercie d'avance pour votre aide.
Hors ligne elendile # Posté le 06/04/2012 à 01:30:44
Avatar

bonsoir et merci pour ces tuto grand merci .

pour nicoloco et lio 2607 il suffit juste d'aller au fichier headers (MaFenetre.h) et d'ajouter

*m_aPropos comme pointeur qui a le type QPushButton et le tour est jouer .

à bientôt
Hors ligne 18sharky81 # Posté le 25/04/2012 à 22:07:42

Avis : Bon

Bonsoir, j'ai un problème: je copie le code de Mateo, pour faire en sorte que le cadran numérique soit en fonction du positionnement de la barre, mais lorsque je compile, il y a les messages "m_slider was not declared in this scope" et pareil pour "m_lcd".
J'ai pourtant recopié le code de Mateo!!
Quelqu'u pourrait-il m'aider? Merci d'avance :)
Hors ligne macmen007 # Posté le 12/05/2012 à 21:44:34

salut a tous!
quelqu'un peut il m'aider a resoudre ce p'tit pb! alors dans la creation d'un slot ,au niveau de compilation, jai d'abord fais le qmake puis jai ensuite compiler mais il m'apparait l'erreur qui est exactment decrit dans le cours a savoir: "undefined reference to 'vtable for MaFenetre" et je sais pas trop comment poursuivre!
Hors ligne Aerendil97 # Posté le 13/05/2012 à 17:43:15
Avatar

Avis : Très bon

Salut,
Très bon tutoriel, sauf qu'au niveau de la compilation du programme de redimensionnement de la fenêtre niveau largeur, j'ai le même code que dans le tuto mais ça me met l'erreur "[debug/moc_MaFenetre.cpp]error -1073741515".
Quelqu'un pourrait-il m'aiguiller???
Merci d'avance,

Aerendil97

Vive les maths et vive les ordis !!!
En somme, vive les sciences exactes!!! :soleil:

«Les ordinateurs sont comme les dieux de l’Ancien Testament : avec beaucoup de règles, et sans pitié.», Joseph Campbell
 
Pour accéder à cette section
Connectez-vous !
connexion_rpx