Vous êtes ici

Créer un thread avec le framework C++ Qt

Pas si évident. C'est documenté bien sur, officiellement et sur les forums mais bon perso j'ai pas tout à fait trouvé mon bonheur côté explications jusqu'à présent. Donc voici comment je fais...

N.B : Le code ci-dessous a été testé avec le SDK Qt 4.6 (pas d'autre version testée)

Dans mon fichier "mainwindow.cpp" : // mainwindow.cpp import *dbImportInstance = new import; QFutureWatcher watcher; QFuture future = QtConcurrent::run(dbImportInstance,&import::NPP_import); QObject::connect(&watcher, SIGNAL(finished()), this, SLOT(handleFinished())); QObject::connect(dbImportInstance, SIGNAL(updateStatusBar(QString)), ui->current_action, SLOT(setText(QString))); watcher.setFuture(future);
Le mot clé "this" correspond à une instance "MainWindow". Pour vous donner une idée, ma classe import (import.h) ressemble à cela :
class import : public QObject { Q_OBJECT public: void NPP_import(); // ... signals: void updateStatusBar(QString); private: //... }
Dans import::NPP_import() du fichier "import.cpp"
void import::NPP_import() { //... emit updateStatusBar("Import in progress, please wait..."); // ... traitement emit updateStatusBar("Done."); //... }
J'ai également ajouté à MainWindow un slot privé, dans la classe MainWindow de "mainwindow.h" on trouve donc :
private slots: void handleFinished();
Et dans "mainwindow.cpp" :
void MainWindow::handleFinished() { qDebug() << "finished"; }
Petite remarque également, le void de QFuture n'est pas anodin, c'est un void parce que import::NPP_import "retourne void"... sinon il me semble que ça bloque à la compilation.

J'imagine que l'on peut améliorer tout ça. N'hésitez pas à partager...