L'envoi du signal de méthode de classe statique dans Qt
Je suis en train de coder un statique de la fonction de callback qui est appelée souvent à partir d'une autre fonction statique à l'intérieur de la même classe. Ma fonction de callback doit emit
un signal, mais pour quelque raison il omet simplement de le faire. Je l'ai mis sous un débogueur et le slot
n'est jamais appelé. Cependant, quand je place le code que j'ai utilisé pour emit
les données dans un non-statique de la fonction, il fonctionne. Est-il une raison pour laquelle je ne peux pas émettre un signal à partir d'une fonction statique? J'ai essayé de déclarer une nouvelle instance de la classe et d'émettre l'appel de la fonction, mais avec pas de chance.
class Foo
{
signals:
emitFunction(int);
private:
static int callback(int val)
{
/* Called multiple times (100+) */
Foo *foo = new Foo;
foo.emitFunction(val);
}
void run()
{
callback(percentdownloaded);
}
};
J'ai posté quelques base de code qui illustre ce que je suis tente de faire. Je vais poster le code complet sur demande.
Edit: je vous poste le code complet car c'est un étrange scénario. http://pastebin.com/6J2D2hnM
Je les connecter dans un autre
.cpp
fichier qui est appelé à appuyer sur un bouton. void MainWindow::on_pushButton_clicked() { tProc = new Foo(this); connect(tProc, SIGNAL(ValChanged(int)), this, SLOT(onNumberChanged(int))); tProc->start(); }
ensuite, il crée une nouvelle instance de mon Foo
classe et démarre le thread qui appelle la fonction de rappel.Dans votre statique de la fonction de rappel vous créez un nouveau Foo instance et d'appel le signal. Je suppose que c'est le point où vous souhaitez émettre le signal. Comment vous connectez-vous à cette instance le logement que vous souhaitez aborder?
Je ne suis pas complètement sûr de ce que tu veux dire, mais je suppose que je l'ai branché correctement dans la
MainWindow::on_pushButton_clicked()
fonction. Dois-je en quelque sorte re-connecter à la fonction statique?Dans
clicked
de la fonction vous avez connecté votre logement à one
Foo
, mais dans callback
vous avez créé un autre Foo
qui ne sait rien à propos de first
foo. Et vous émettre le signal de cette nouvelle Foo
, mais les signaux de nouveaux Foo
ne sont pas connectés à toutes les machines à sous.
OriginalL'auteur user99545 | 2012-02-23
Vous devez vous connecter pour publier un commentaire.
Qui n'est pas d'aller travailler, parce que vous êtes la création d'un nouveau Foo chaque fois que vous entrez dans la fonction statique, et vous n'avez pas connecter un signal à un slot.
Donc, la solution serait de passer l'objet à cette fonction :
Une autre option est d'utiliser postEvent, mais je ne le recommande pas.
Puisque vous ne pouvez pas modifier rappel de la signature, vous pouvez le faire comme ceci :
mais vous aurez à initialiser cette variable statique quelque part.
ajouter une variable statique, qui est utilisé dans la fonction de rappel. Je vais modifier la réponse
Merci. J'ai fini à l'aide de votre variable statique et initialisé en passant l'actuelle instance de classe en tant que paramètre à la discussion. J'ai utilisé ce paramètre à initialiser la classe et cela a fonctionné.
Merci beaucoup! J'ai perdu des heures à essayer de le faire fonctionner, votre deuxième suggestion était super!
J'ai essayé la deuxième approche, mais il dit undefined reference to `Foo ::theFoo " quand je veux initialiser l'entrepreneur.
OriginalL'auteur BЈовић
dans le cas où quelqu'un l'a encore de trouver la solution, voici ce que j'ai fait, ça fonctionne dans mon projet.
1. faire de votre classe à un singleton
2. en statique cb fonction de la charge emitFunction de votre classe singleton
OriginalL'auteur max
Il y a une solution élégante. Vous pouvez émettre un signal dans une fonction membre statique comme ceci:
OriginalL'auteur Louis Xu
Vous devez fournir un pointeur vers l'instance de la classe afin de le faire fonctionner.
Remarquer cependant qu'en général, il n'est pas conseillé d'émettre des signaux de fonctions statiques. Statique fonctions peuvent être appelées sans la création d'une instance de la classe, ce qui signifie que (si vous ne fournissez pas que l'argument de l'expéditeur et de l'utiliser explicitement), vous n'aurez pas un "expéditeur" de l'objet pour la dégager de signaux.
Pour ces cas comme Lol4t0 suggère je préfère aussi les rappels.
OriginalL'auteur pnezis