Bonjour,
je suis en train de développer un logiciel et j'ai quelques soucis entre la gui et le chargement d'une vidéo qui peut prendre quelques secondes à cause d'éléments d'initialisation.
Je voudrais pouvoir afficher un BusyIndicator le temps que ma vidéo se charge pour indiquer à l'utilisateur que tout va bien et qu'il faut juste qu'il soit un peu patient.
Sauf que tout ne fonctionne pas exactement comme je le souhaite.
J'ai donc un fichier qml
Code qml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Rectangle { id : videoDisplay ... BusyIndicator{ id: busyIndicator anchors.centerIn: parent running: false } VideoManager{ // classe C++ pour gérer l'affichage de ma vidéo - détaillé ci-dessous id: videomanager onPathChanged: { // changement de chemin busyIndicator.running = true; videomanager.loading(); // chargement de la vidéo }
et une classe C++
Pourquoi je mets ma fonction initialize dans un thread? Car sinon mon interface graphique est bloqué et je n'ai pas mon busyindicator actif.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 class VideoManager : public QQuickPaintedItem { Q_OBJECT public: VideoManager(QQuickItem *parent=0) ... Q_INVOKABLE void loading(); public slots: void initialize(); ... }; VideoManager::VideoManager(QQuickItem *parent) : QQuickPaintedItem(parent), ...{ ... } void VideoManager::loading(){ ... // chargement de divers éléments et mise en connection de signaux variés QThread *thread = new QThread(); moveToThread(thread); connect(thread, SIGNAL(started()), this, SLOT(initialize())); connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); thread->start(); ... } void VideoManager::initialize(){ if(myVideoReader_->initialize()){ // tout est bon QObject::connect(myVideoReader_, SIGNAL(updateDisplay()), this, SLOT(onUpdateDisplay())); // connexion de l'affichage ... emit okSignal(); } else{ ... emit koSignal(); } }
J'ai essayé un QConcurrent::run sans grand succès (j'ai d'ailleurs un problème d'accès aux attributs de ma classe quand je les utilise).
Ma question est comment faire pour résoudre ce soucis de thread car parfois ça marche et parfois ça ne marche pas mais j'ai toujours le Warning: QObject::moveToThread: Cannot move objects with a parent
Ce qui veut dire que ce que j'ai écrit est un correct or je ne vois pas trop comment résoudre cette gestion de l'héritage et de thread.
Merci de toute l'aide et explication que vous pourriez m'apporter
L'elfe d'Azur
Partager