Comment QSignalMapper travail?
Après mon post ici : Associé de signaux et de slots pour une qcheckbox créer dynamiquement je dois associer :
• Le signal clicked()
lorsque je clique sur un qCheckBox
à ma fonction cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox)
Pour ce faire, je dois utiliser QSignalMapper
, après deux heures d'essayer de comprendre comment il fonctionne, je ne peux pas avoir un bon résultat, voici le code que je fais, ce qui est évidemment faux :
QSignalMapper *m_sigmapper = new QSignalMapper(this);
QObject::connect(pCheckBox, SIGNAL(mapped(QTableWidget*,int, QCheckBox*)), pCheckBox, SIGNAL(clicked()));
QObject::connect(this, SIGNAL(clicked()), this, SLOT(cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox)));
m_sigmapper->setMapping(pCheckBox, (monTab,ligne, pCheckBox));
QObject::connect(m_sigmapper, SIGNAL(clicked()),this, SLOT(cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox)));
Pouvez-vous m'expliquer, comment QSignalMapper
œuvres ? Je ne comprends pas vraiment ce à associer avec 🙁
pourquoi devez-vous utiliser
Eh bien, dans l'autre post, ils m'expliquent qu'un signal peut pas se connecter à une machine à sous avec plus de paramètre, et le signal clicked() n'ont pas de paramètres. Aussi j'ai besoin de ces 3 paramètres.
vrai, la fente peut être autant ou moins le nombre de paramètres que le signal correspondant. mais vous pouvez écrire un logement qui ne prend aucun paramètre, puis d'appeler le sous réelle, de méthode, de ce avec le paramètre requis.
Oui mais comment je peux lui passer les 3 paramètres : QTableWidget *monTab, int ligne, QCheckBox *pCheckBox ? Si vous avez lu l'autre post, vous aurais-je des centaines de qCheckBox, donc je ne peux pas utiliser des pointeurs.
Pour comprendre comment
QSignalMapper
? une raison en particulier? cela peut être fait facilement avec une connexion directeEh bien, dans l'autre post, ils m'expliquent qu'un signal peut pas se connecter à une machine à sous avec plus de paramètre, et le signal clicked() n'ont pas de paramètres. Aussi j'ai besoin de ces 3 paramètres.
vrai, la fente peut être autant ou moins le nombre de paramètres que le signal correspondant. mais vous pouvez écrire un logement qui ne prend aucun paramètre, puis d'appeler le sous réelle, de méthode, de ce avec le paramètre requis.
Oui mais comment je peux lui passer les 3 paramètres : QTableWidget *monTab, int ligne, QCheckBox *pCheckBox ? Si vous avez lu l'autre post, vous aurais-je des centaines de qCheckBox, donc je ne peux pas utiliser des pointeurs.
Pour comprendre comment
QSignalMapper
fonctionne, voici un bonne pour vous de commencer avec.OriginalL'auteur Evans Belloeil | 2014-06-17
Vous devez vous connecter pour publier un commentaire.
QSignalMapper
classe recueille un ensemble de sans paramètre signaux, et re-émet avec entier, chaîne de caractères ou un widget paramètres correspondant à l'objet qui a envoyé le signal. Vous pouvez donc avoir un comme:Pour chacun de vos boutons, vous pouvez connecter le
clicked()
signal à lamap()
fente deQSignalMapper
et ajouter une cartographie à l'aide de setMapping de sorte que lorsqueclicked()
est signalé à partir d'un bouton, le signalmapped(QWidget *)
est émise:De cette façon, chaque fois que vous cliquez sur un bouton, le
mapped(QWidget *)
signal de la mapper est émis contenant le widget en tant que paramètre.Il n'est pas possible d'avoir plus d'un paramètre. Vous pouvez avoir le widget en tant que membres de la classe et de l'accès dans le logement.
Qu'entendez-vous membre de la classe ? Si je ne peux pas le passer comme paramètre comment puis-je le trouver ?
Je veux dire que vous pouvez mettre des pointeurs vers vos widgets dans votre classe .h fichier en tant que privé. Ensuite, vous pouvez y accéder.
Pas de. Les variables globales ne doit pas être utilisé en programmation orientée objet. Vous pouvez tout simplement l'accès à l'pointeur de vos widgets dans votre classe.
OriginalL'auteur Nejat
Je vais d'abord vous expliquer comment
QSignalMapper
œuvres. Ensuite, je vais vous expliquer pourquoi vous n'en avez pas besoin.Comment
QSignalMapper
travaux:Créer s
QSignalMapper
. Supposons que vous souhaitez affecter une valeur entière pour chaque case, de sorte que chaque fois que vous cliquez sur une case, vous obtiendrez un signal avec la valeur de l'entier lui est assigné.Connecter le mappeur de signal de votre LOGEMENT, que vous allez mettre en œuvre:
Maintenant, vous pouvez écrire logement, qui va prendre en argument entier. L'argument sera différente pour chaque case à cocher que vous avez.
Lors de la création de cases à cocher, pour chaque case, vous devez effectuer les opérations suivantes:
À partir de maintenant, chaque fois que vous cliquez sur une case, il émettra
clicked()
signal à laQSignalMapper
, qui sera alors la carte à l'integer valeur et émettentmapped()
signal. Vous vous êtes connecté àmapped()
signal,yourSlot(int)
sera appelée avec la bonne valeur de type entier.Au lieu de nombres entiers, vous pouvez affecter
QString
,QWidget*
ouQObject*
(voir la documentation de Qt).C'est de cette façon
QSignalMapper
travail.Vous n'en avez pas besoin:
QTableWidget *monTab
est le seul objet, il ne change pas. Le garder en tant que membre de la classe de terrain et de l'utiliser à partir de votre logement de fonction.QCheckBox *pCheckBox
- vous pouvez l'obtenir par moulagesender()
àQCheckBox*
.Comme ceci:
La
sender()
fonction est deQObject
, à laquelle vous faites hériter de, de sorte que vous avez accès.int linge
(c'est un numéro de ligne, non?) - lorsque vous créez des cases à cocher, vous pouvez stocker des pointeurs pour que des cases à cocher dansQList
champ de la classe et de l'utiliser à partir de votre logement de fonction, trouver la ligne, comme ceci:Dans la déclaration de classe:
Lors de la création de cases à cocher:
Dans votre logement de fonction:
Si vous le souhaitez, vous pouvez sauter cette
QList
et l'utilisationQSignalMapper
et attribution des lignes de cases à cocher à l'aide de mapper. C'est juste une question de ce que vous préférez.OriginalL'auteur Googie