Comment déconnecter un signal avec un slot temporairement en Qt?
- Je connecter un slot avec un signal. Mais maintenant, je veux déconnecter temporairement.
Ici une partie de ma déclaration de classe:
class frmMain : public QWidget
{
...
private:
QTimer *myReadTimer;
...
private slots:
void on_btnDownload_clicked();
...
};
Dans le constructeur de frmMain
je me connecte myReadTimer
avec une fente de sorte que ReadMyCom
sera appelée à chaque 5 secondes:
myReadTimer=new QTimer(this);
myReadTimer->setInterval(5000);
connect(myReadTimer,SIGNAL(timeout()),this,SLOT(ReadMyCom()));
Mais, dans le logement on_btnDownload_clicked
. Je ne veux pas myReadTimer
d'émettre un signal dans les on_btnDownload_clicked
champ d'application. Je tiens donc à les déconnecter au début de on_btnDownload_clicked
et reconnectez-le à la fin. Comme ceci:
void frmMain::on_btnDownload_clicked()
{
//some method to disconnect the slot & singal
...//the code that I want myReadTimer to leave me alone
//some method to reconnect the slot & singal
}
J'ai cherché dans Stackoverflow et a obtenu une réponse comme appeler la QObject
destructeur. Mais je ne sais pas comment l'utiliser.
J'ai aussi essayé d'utiliser disconnect
comme:
QMetaObject::Connection myConnect;
myConnect=connect(myReadTimer,SIGNAL(timeout()),this,SLOT(ReadMyCom()));
...
disconnect(& myConnect);
Mais toujours pas de travail. Ainsi pouvait-on m'aider comment faire?
source d'informationauteur ctxrr
Vous devez vous connecter pour publier un commentaire.
Il y a une très belle fonction dans
QObject
qui vient à portée de main chaque maintenant et encore:QObject::blockSignals()
Voici un simple feu et oublier classe qui va faire ce que vous voulez. Je ne prends pas de crédit pour son design, je l'ai trouvé quelque part sur internet il y a longtemps. Attention tout de même, il permet de bloquer tous les signaux de tous les objets. Si ce n'est pas ce que vous voulez, vous pouvez modifier la classe pour répondre à vos besoins.
Utilisation, dans votre cas, il devient trivial
Mise à JOUR:
Je vois qu'à partir de Qt 5.3, très semblable à la classe a été offically ajoutées à l'API. Il a fait un travail similaire au précédent, avec un peu plus de fonctionnalités. Je vous suggère d'utiliser la langue officielle QSignalBlocker classe à la place afin de garder votre base de code-à-jour avec toutes les modifications de l'API.
D'utilisation, cependant, reste exactement la même.
De se déconnecter/reconnecter la syntaxe
Il existe de nombreuses façons d'appeler déconnecter, selon exactement ce que vous voulez déconnecté. Voir QObject page de documentation pour une explication de la façon dont ils travaillent.
Voici un exemple d'utilisation de 0 à dire "débrancher tous les connecteurs."
Ou vous pouvez spécifier exactement signal-slot paire de déconnecter par la copie de votre 'connect' la syntaxe, comme ceci:
L'arrêt de la minuterie
Puisque vous travaillez avec une minuterie, ce peut être plus simple:
Différences à partir de votre approche originale:
interval
après votre logement de fonction se termine.Avez-vous besoin de faire quelque chose de spécial?
Dans un seul thread application Qt, si vous êtes déjà en cours de traitement d'un signal, un autre signal ne sera pas "sauter au milieu" de ce code. Au lieu de cela, il va être mis en file d'attente comme même de gérer immédiatement après la plage actuelle renvoie.
Alors peut-être que vous n'avez pas besoin d'arrêter ou débrancher votre minuterie.
Différences à partir de votre approche originale:
on_btnDownload_clicked
prend un certain temps à s'exécuter, vous pourriez avoir plusieursReadMyCom
événements de la file d'attente aprèson_btnDownload_clicked
complète. (Notez qu'à ce stade, vous auriez une opération qui, en gros, "bloque" de votre interface depuis un bon moment; il peut faire plus de sens de refactoriser la fonction ou le donner son propre thread.)