Bonjour,
Je développe une extension dans QGIS.
Elle est opérationnelle, il ne me reste plus qu'à lancer une barre de progression pour les traitements longs.
J'ai donc d'abord fait un test de la barre de progression "à vide" avec ce code:
Dans le run de du plugin:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
			self.progressDlg = QtGui.QProgressDialog()
				self.progressDlg.setRange(0,100)
				self.threadJointure = ThreadJointure(bdd, zonesT)
				self.threadJointure.notifyProgress.connect(self.onProgress)
				self.threadJointure.endThread.connect(self.onEnd)
				self.bThreadEnCours = True
				self.threadJointure.start()		
				while self.bThreadEnCours:
					time.sleep(2)
dans la classe principale du plugin:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
def onProgress(self, i):
	self.progressDlg.show()
	self.progressDlg.setValue(i)
def onEnd(self):
	self.bThreadEnCours = False
ma classe qui hérite de QThread:
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
 
class ThreadJointure(QtCore.QThread):
	def __init__(self, bdd, zonesT, parent=None):
		QThread.__init__(self, parent)
		self.bdd = bdd
		self.zonesT = zonesT
	def run(self):
		self.notifyProgress.emit(0)
		time.sleep(3)
		self.notifyProgress.emit(33)
		time.sleep(3)
		self.notifyProgress.emit(66)
		time.sleep(3)
		self.notifyProgress.emit(100)
		self.endThread.emit()
	notifyProgress = QtCore.pyqtSignal(int)
	endThread = QtCore.pyqtSignal()
Quand je lance ça, il ne sort pas de la boucle while.
Donc le signal n'est pas lancé.
J'ai donc ajouté un "QtCore.QCoreApplication.processEvents()"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
				while self.bThreadEnCours:
					time.sleep(2)
					QtCore.QCoreApplication.processEvents()
Là c'est nickel, j'ai ma barre de progression qui avance. Parfait.
Sauf que ça n'a aucun intérêt d'afficher une barre de progression sans traitement derrière.
Donc je prends le risque et je remplace la partie du run dans le Thread pour faire appel au traitement (seulement un petit morceau pour commencer):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
class ThreadJointure(QtCore.QThread):
	def __init__(self, bdd, zonesT, parent=None):
		QThread.__init__(self, parent)
		self.bdd = bdd
		self.zonesT = zonesT
	def run(self):
		self.notifyProgress.emit(0)
		# affectation des vecteurs à traiter
		self.bdd.remplirTableZon(self.zonesT)
		self.notifyProgress(100)
		self.endThread.emit()
	notifyProgress = QtCore.pyqtSignal(int)
	endThread = QtCore.pyqtSignal()
et là c'est la catastrophe!

message qgis de plantage dumpé : minidump dans c:/...
Donc voilà...
A savoir dans mon remplirTableZon, je récupère le contenu d'une couche vecteur pour tout mettre dans une base spatialite.
J'ai essayé de passer par un une classe dérivant de QObjet que je migre vers un QThread. Là pas de plantage, mais rien n'est fait: il fait comme si la base de donnée n'existait pas! Par contre il envoie bien le signal de fin de traitement...

Si j'enlève le processEvents il boucle à l'infini conne si personne n'envoyait de message...

Merci pour votre aide.