Meine Anwendung empfängt keine Daten mehr mit QSerialPort, während QFileDialog::getExistingDirectory
verwendet wird. Es nimmt den Empfang von Daten nach dem Schließen des Dialogs wieder auf. Gibt es eine Möglichkeit, das zu verhindern?QSerialPort reagiert nicht mehr, während QFileDialog :: getExistingDirectory aktiv ist
1
A
Antwort
1
Sie rufen eine Blockierungsmethode auf. Während diese Methode ausgeführt wird, kann die Ereignisschleife nicht ausgeführt werden, da sie sich irgendwo unterhalb des Aufrufstapels befindet und darauf wartet, dass Ihr Slot zu ihr zurückkehrt. Dies ist die synchrone Art der Kodierung, die nicht reflektiert, was wirklich passiert, da die Welt asynchron ist. Also nicht so programmieren.
Stattdessen sollten Sie den Dateidialog einrichten, während er unsichtbar ist, dann show()
und den gewünschten Code in einem Steckplatz ausführen, der mit dem Signal QDialog::accepted()
verbunden ist.
Sie das Setup-Faktor könnte und haben einen schönen asynchronen Helfer, verwendet in ähnlicher Weise zu getExistingDirectory
:
template <typename F> void withExistingDirectoryDo(F && fun, QObject * context = 0,
QWidget * parent = 0, const QString & caption = QString(),
const QString & dir = QString(), Options options = QFileDialog::ShowDirsOnly) {
auto * dialog = new QFileDialog(parent);
auto helper = [fun, dialog]{ fun(dialog->directory()); };
if (context)
connect(dialog, &QDialog::accepted, context, helper);
else
connect(dialog, &QDialog::accepted, helper);
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->setOptions(options);
dialog->setFileMode(QFileDialog::Directory);
dialog->show();
}
Hier ist der Code Transformation:
void before() {
foo();
auto dir = QFileDialog::getExistingDirectory(); // bad synchronous code
bar(dir);
}
void after() {
foo();
withExistingDirectoryDo([this](const QDir & dir) {
bar(dir);
}, this);
}
Verwandte Themen
- 1. AudioServicesPlaySystemSound, während AVCaptureSession aktiv ist
- 2. Python Spyder reagiert nicht mehr
- 3. Anwendung VB6 reagiert nicht mehr
- 4. VS2015 Entwurfsansicht reagiert nicht mehr
- 5. QFileDialog Speicherleck?
- 6. Python Flask Webserver reagiert nicht mehr
- 7. die Seite reagiert nicht mehr, wenn die while-Schleife ist
- 8. setMyLocationEnabled (true) ist nicht mehr reagiert, langsam Bildwiederholfrequenz
- 9. Cassini reagiert nicht mehr beim Debuggen
- 10. WCF "Self-Hosted" -Anwendung reagiert nicht mehr
- 11. Anwendung reagiert nicht mehr auf Orakelsperre
- 12. Javascript ist nicht aktiv
- 13. Socket Server Speicherverbrauch steigt, reagiert nicht mehr
- 14. Redis reagiert nicht mehr bei hoher Auslastung
- 15. C# macht Speechsynthesizer Dienst nicht mehr reagiert
- 16. UIView touchsbegan reagiert nicht während der Animation
- 17. Warum reagiert MongoDB während eines Auslastungstests nicht?
- 18. QSerialPort pretread() SIGNAL
- 19. QSerialPort: Falsche Werte lesen
- 20. WebBrowser Control bewirkt, dass ganze Anwendung nicht mehr reagiert
- 21. Ist Google Guice aktiv?
- 22. WebApp reagiert nicht mehr nach dem Initiieren der Remotedesktopverbindung
- 23. Warum große Dateien mit system.io kopieren File.Copy reagiert in Windows-Formularen nicht mehr/reagiert nicht.
- 24. Haupt-MFC-Fenster ausblenden, während der modale Dialog aktiv ist?
- 25. Animierte UIWebView reagiert nicht auf Berührungen während der Animation
- 26. Interagieren mit anderen Ansichten, während ein Popover aktiv ist
- 27. Kann ich ein MouseLeave-Ereignis erhalten, während Mouse.Capture() aktiv ist?
- 28. Interagieren mit Hauptfenster, während modales Fenster aktiv ist
- 29. Icons zur Registerkarte hinzufügen, während Actionbar aktiv ist
- 30. Apple Game Center reagiert nicht mehr auf Ereignisse
es durch Hinzufügen der Flagge „QFileDialog arbeitet :: DontUseNativeDialog "QString ldossier = QFileDialog :: getExistingDirectory (dies ist" Sélectionner un dossier "," c:/PROJET/Qt/sauvegarde/texte/", QFileDialog :: ShowDirsOnly | QFileDialog :: DontUseNativeDialog); – iboua