[Solved] PyQt4: Signals/Slots

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
sk
User
Beiträge: 2
Registriert: Freitag 12. Oktober 2007, 22:11

Hi,

Ich habe bisher in C++ und Qt programmiert und wollte nun mal PyQt4 ausprobieren. Ich habe mir mit dem Designer ein simples Window erstellt und versuche nun meine Signals mit selbst definierten Slots zu connecten. Laut http://www.riverbankcomputing.com/Docs/ ... -and-slots kann ich fuer den Slot eine ganz normale Python Funktion verwenden, richtig?

Ich habe nun zwei Dateien:
  • *UI_Main.py - welches das aus dem .ui file (QtDesigner) generierte Python file ist
    *main.pyw - mein simples Programm

Code: Alles auswählen

#main.pyw
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4 import QtGui, QtCore

from UI_Main import Ui_MainWindow 

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent = None):
        QMainWindow.__init__(self, parent)
        self.setupUi(self)
        
        #self.connect(self.ButtonAdd, SIGNAL("clicked()"),self.addEntry)
        connect(self.ButtonAdd,QtCore.SIGNAL("clicked()"),self.close)
        
    def addEntry(self):
        self.lineEditAdd.setText("Test")
        self.listCars.addItem("Test")
                          
if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Main = MainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(Main)

    Main.show()
    sys.exit(app.exec_())
Zuerst hatte ich versucht, indem ich auf den ButtonAdd klicke meine eigene Funktion addEntry aufzurufen. Das hat aber nicht funktioniert.

Dann habe ich versucht, dass der Button einfach das Programm beendet, naemlich mit self.close als SLOT.
In der automatisch generierten Ui_MainWindow Klasse funktioniert das naemlich einwandfrei:

Code: Alles auswählen

QtCore.QObject.connect(self.ButtonQuit,QtCore.SIGNAL("clicked()"),MainWindow.close)
Kann mir bitte jemand den Unterschied zwischen dem automatisch generierten Connect und meinem Connect erklaeren? Vermutlich ist es etwas ganz simples.


Vielen Dank
Zuletzt geändert von sk am Dienstag 23. Oktober 2007, 01:15, insgesamt 1-mal geändert.
BlackJack

Nur geraten, aber müsstest Du nicht auch in Deiner abgeleiteten Klasse die `__init__()` von der UI-Klasse aufrufen? Wenn da die automatisch generierten `connect()`\s drinstehen, müssten sie ja auch mal ausgeführt werden.
sk
User
Beiträge: 2
Registriert: Freitag 12. Oktober 2007, 22:11

Habs gefunden, die beiden Zeilen

Code: Alles auswählen

ui = Ui_MainWindow()
    ui.setupUi(Main) 
mussten raus. Ich weiss noch nicht wirklich wie Python (Interpreter) im Vergleich zu C/C++ (Compiler) funktioniert, aber anscheinend hat es da einfach irgendwas ueberschrieben oder in der falschen Reihenfolge gemacht.
Antworten