Seite 1 von 1

QDialog schließen nachdem Thread fertig ist.

Verfasst: Samstag 2. Juli 2011, 11:55
von yaem
Ich möcht einfach gesagt einen QDialog haben der bestimmte Vorgänge ausführt und den Fortschritt in einer QProgressBar visualisiert.
Damit der Dialog aber weiter ánsprechbar bleibt(z.B. über 'Abbrechen') kommen die Berechnungen in einen eigenen Thread. Das ganze sieht dann ungefähr so aus:

Code: Alles auswählen

import _thread
import time

from PyQt4 import uic
from PyQt4.QtCore import *
from PyQt4.QtGui import *


(Ui_TestExec, QDialog) = uic.loadUiType('testexec.ui')

class TestExec(QDialog):

  def __init__ (self, parent):
    QDialog.__init__(self, parent)
    self.ui = Ui_TestExec()
    self.ui.setupUi(self)
    
  
  def exec(self):
    QDialog.open(self)
    
    _thread.start_new_thread(self.copy, (None,))    
    
    
  def copy(self, args):   
    for v in range(0, 101):
      time.sleep(0.01)
      self.ui.bar.setValue(v)
      
    self.close()
Der Dialog schließt sich auch bei Erfolg, allerdings mit einer Fehlermeldung:
QObject::killTimer: timers cannot be stopped from another thread
Wie realisiere ich das am besten richtig?

Re: QDialog schließen nachdem Thread fertig ist.

Verfasst: Samstag 2. Juli 2011, 12:04
von BlackJack
@yaem: Als allererstes solltest Du die Finger vom `_thread`-Modul lassen. Per Konvention sind führende Unterstriche ein Zeichen für interne Objekte, die nicht von aussen benutzt werden sollen. Für Threads in ”normalem” Python ist das `threading`-Modul als Schnittstelle vorgesehen.

Da Du aber ein Qt-Programm schreibst, solltest Du einen Blick in die dortigen Klassen werfen. QThread emittiert zum Beispiel ein Signal wenn der Thread fertig ist.

Re: QDialog schließen nachdem Thread fertig ist.

Verfasst: Sonntag 3. Juli 2011, 09:56
von yaem
Hey, danke! Funktioniert wunderbar! :)