2016-05-10 10 views

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); 
} 
+0

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

Verwandte Themen