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...