[gelöst] Problem mit "beendet"-Signal von Qprocess

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
darkstorm
User
Beiträge: 2
Registriert: Montag 18. Februar 2008, 22:20

Hi,

seit 2 Tagen versuche ich verzweifelt das "beendet"-Signal eines QProcess zu verarbeiten.

Hier ein Beispielscript mit welchem sich das Problem reproduzieren lässt.

Code: Alles auswählen

#!/usr/bin/env python 
#-*- coding: utf-8 

import sys
import os
from PyQt4 import QtCore, QtGui
from frmMain import Ui_MainWindow

class StartQT4(QtGui.QMainWindow):
    #
    # Initialisation
    #
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        
        # process and slots
        self.qp = QtCore.QProcess()
        QtCore.QObject.connect(self.qp, QtCore.SIGNAL("started()"), self.qpStart)

        # keines dieser Signale wird gesendet        
        QtCore.QObject.connect(self.qp, QtCore.SIGNAL("stateChanged()"), self.qpStateChanged)
        QtCore.QObject.connect(self.qp, QtCore.SIGNAL("finished()"), self.qpExit)
        QtCore.QObject.connect(self.qp, QtCore.SIGNAL("readyReadStdout()"), self.qpExit)
        QtCore.QObject.connect(self.qp, QtCore.SIGNAL("processExited()"), self.qpExit)
        
        
        # button
        QtCore.QObject.connect(self.ui.btn_get_syx,QtCore.SIGNAL("clicked()"), self.get_syx_clicked)
    
    
    #
    # button
    #    
    def get_syx_clicked(self):
        self.ui.textBrowser.append("starting process")
        #kleines GUI-Programm welches ich per dann Hand beende
        self.qp.start('kcalc')
        self.ui.textBrowser.append("process started")
        
       
        
    # funktioniert    
    def qpStart(self):
        self.ui.textBrowser.append("[slot] process started")

    # funktioniert nicht   
    def qpExit(self):
        self.ui.textBrowser.append("[slot] process exited")

    # funktioniert nicht 
    def qpStateChanged(self):
        self.ui.textBrowser.append("[slot] process state changed")
    
#            
# start the main application
#
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = StartQT4()
    myapp.show()
    sys.exit(app.exec_())
Da ich im Netz verschiedene Beispiele für das "beendet"-Signal gefunden habe, habe ich alle Möglichkeiten verbunden (22 ff.) aber der qpExit-Slot wird nie aufgerufen.

Hat jemand eine Idee?

TIA darkstorm

PS: Ich bin PyQt-Einsteiger ;-) und verwende PyQt4.0.1 and Qt 4.3.3 unter Debian Etch.
Zuletzt geändert von darkstorm am Mittwoch 5. März 2008, 21:47, insgesamt 1-mal geändert.
Gnushi
User
Beiträge: 77
Registriert: Dienstag 12. Dezember 2006, 09:49

Hi Darkstorm!
darkstorm hat geschrieben:seit 2 Tagen versuche ich verzweifelt das "beendet"-Signal eines QProcess zu verarbeiten.
Diese Signale haben Signaturen, die du erfüllen musst, siehe http://doc.trolltech.com/4.3/qprocess.html und anschließend http://www.riverbankcomputing.com/Docs/ ... t4ref.html .
Kannst also nicht einfach schreiben "stateChanged()", wenn Du in Wirklichkeit "stateChanged(QProcess::ProcessState newState)" meinst.

Hoffe, das hilft für den Anfang

GnuShi
darkstorm
User
Beiträge: 2
Registriert: Montag 18. Februar 2008, 22:20

Hi Gnushi,

vielen Dank Du hast mir sehr geholfen. Das Problem sind die kleinen Änderungen in der Syntax über verschiedene QT-Versionen. Dadurch bekommt man auch mit Beispielcode aus dem Internet schnell Probleme, sofern dieser nicht der verwendeten Version entspricht.

Hier die Lösung:
Zu den Slots (Zeile 25-27 im OP):

Code: Alles auswählen

QtCore.QObject.connect(self.qp, QtCore.SIGNAL("started()"), self.qpStart)
QtCore.QObject.connect(self.qp, QtCore.SIGNAL("finished(int)"), self.qpExit)
QtCore.QObject.connect(self.qp,QtCore.SIGNAL("readyReadStandardOutput()"), self.qpReady)
Zusätzlich habe ich die Funktion qpReady hinzugefügt um das Signal explizit erkennen zu können.

Jetzt werden alle verbundenen Funktionen entsprechend aufgerufen.

Um die Rückgabe eines Konsolenbefehls (z.B. "hostname") anzuzeigen :

Code: Alles auswählen

def qpExit(self):
    self.ui.textBrowser.append("[slot] process exited")
    self.ui.textBrowser.append(QtCore.QString(self.qp.readAllStandardOutput()))
Grüße darkstorm
Antworten