Question

Je suis en train d'éviter une condition de course dans le scénario suivant:

QDialog* dialog = [...];
QThread* thread = [...];

connect(thread, SIGNAL(finished()), dialog, SLOT(accept()));

thread->start();
dialog->exec();

Lorsque la fin du thread avant QDialog :: exec () a mis en place la boîte de dialogue, le « accept () » appel qui a été déclenché par le signal sera perdu et la boîte de dialogue ne se ferme pas lui-même ...

Donc, idéalement, je veux commencer le fil seulement après la boîte de dialogue est prêt à gérer, mais comment pourrais-je faire?

Était-ce utile?

La solution

L'astuce est que vous devez commencer le fil que lorsque la boîte de dialogue apparaît déjà. donc vous devez démarrer une fois que le showEvent du QDialog est élevé.
D'abord, vous devez saisir le showEvent, vous pouvez le faire soit en utilisant QObject::installEventFilter et QObject::eventFilter ou par le sous-classement QDialog remplaçant QWidget::showEvent.
Une fois que vous avez fait cela, vous voulez signaler le fil pour commencer. Vous avez besoin d'un signal personnalisé, que vous émettez dans YourClass::eventFilter ou YourClass::showEvent selon la manière dont vous avez choisi de capturer l'événement show.
Maintenant, il suffit de connecter ce signal à la fente de QThread::start() et vous devriez faire (EDIT: utiliser un Qt::QueuedConnection).
Assurez-vous que vous ne gérez le signal QDialog::accepted() deux fois!

Autres conseils

était un moment que je Qt. Mais pourquoi vous utilisez un QThread pour gérer Accept clic à partir de la boîte de dialogue? Vous pouvez utiliser QDialog :: résultat () si elle est une boîte de dialogue modale ou vous pouvez transmettre le signal du fil à QDialog :: accepté () ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top