Signal aus klasse heraus?

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
_patrice_
User
Beiträge: 6
Registriert: Dienstag 1. Juni 2010, 19:12

Hallo,

ich bin noch recht neu in Python, sorry also für die wahrscheinlich recht blöde Frage. Ich habe mir ein Fenster gemacht in dem bei click auf einen Button eine Instanz einer Klasse "h5Maker" erzeugt wird, die mir dann Daten ins .h5 Format schreibt. Nun verzweifle ich etwas an dem Unterfangen aus dieser Klasse heraus ein Signal an eine ProgressBar in meinem Fenster zu schicken.

Hätte vielleicht jemand Lust mir ein bischen weiterzuhelfen?

Danke schonmal!

Code: Alles auswählen

class LabelViewer(QtGui.QWidget):
    def __init__(self, parent=None):
        #print "__init__ LabelViewer\n"
        QtGui.QWidget.__init__(self, parent)
.
.
.

     #progress bar
     #self.pbar = QtGui.QProgressBar(self)
.
.
.

      #convert to .h5 button
      def convertClicked(self):
             h5 = h5Maker()


class h5Maker:
       #Von hier sollte irgendwie der pbar gesagt werden wie weit sie ist??? 
lunar

Nun, Du deklarierst in Deiner Klasse zwei Signale (zur Deklaration von Signalen siehe PyQt4 Dokumentation). Eines davon löst Du aus, bevor Du mit dem Schreiben der Daten beginnst. Diesem Signal gibst Du als Argument mit, wie viele Schritte zum Schreiben nötig sind, und verbindest es mit dem Slot "QProgressBar.setMaximum()". Das andere löst Du jedes Mal aus, wenn Du einen solchen Schritt abgeschlossen hast, und verbindest es mit dem Slot "QProgressBar.setValue". Dann zeigt der Fortschrittsbalken den Fortschritt auch an.

Wie Du das Schreiben in Schritte unterteilst, musst Du selbst herausfinden. Der gezeigte Quelltext ist in dieser Hinsicht ja nicht sonderlich aussagekräftig.
_patrice_
User
Beiträge: 6
Registriert: Dienstag 1. Juni 2010, 19:12

Danke für die Tip's, habe es geschaft:

Falls jemand mal an Ähnlichem hängt, meine Lösung:

In der Window Klasse:

Code: Alles auswählen

class Window(QtGui.QWidget):

    #progressBar
    self.pbar = QtGui.QProgressBar(self)

    #Emitterklasse
    self.instance = EmitterClass()

    #Connect Methoden die Signalwerte setzen mit Signalen
    self.connect(self.instance, QtCore.SIGNAL("sigSetPBarMax"), self.setPBarMaximum)
    self.connect(self.instance, QtCore.SIGNAL("sigPBarVal"), self.setPBarValue)
  

    #definiere Methoden die Signalwerte setzen
    def setPBarMaximum(self, val):
        self.pbar.setMaximum(val)

    def setPBarValue(self, val):
        self.pbar.setValue(val)

In Klasse EmitterClass:

Code: Alles auswählen

class EmitterClass(QtCore.QObject):
        #definiere zwei Signale
        def setPBarMax(self,value):
                self.emit(QtCore.SIGNAL("sigSetPBarMax"), value)

        def setPBarVal(self,value):
                self.emit(QtCore.SIGNAL("sigPBarVal"), value)


        #initialisiere progressbar durch Signal vor Konvertierung mit Maximalzahl an Schritten
        self.setPBarMax(self.__maxSteps)
        #setze ersten Schritt
        self.__statusValue = 1
        self.setPBarVal(self.__statusValue)


        #während Prozessablauf sende immer statusValue an ProgressBar
        ...
        self.__statusValue += 1
        self.setPBarVal(self.__statusValue)
        ...
 
lunar

Es gibt eine schönere API für Signal und Slots, lies mal den PyQt4 Reference Guide.
Antworten