2016-07-21 10 views
1

ersten, der Code Rahmen meiner Probleme:PyQt5: Klärung connect() -Methode in QMessageBox standardButtons

from PyQt5 import QtWidgets, QtCore 

# I found this function on the web: 
def msgbtn(i): 
    """ 
    This function works, and returns "Ok" or "Cancel" (string object). 
    """ 
    print("Button pressed is:", i.text()) 
    return i.text() 


# Create a basic message box 
msg = QtWidgets.QMessageBox() 
msg.setText("Try") 
msg.setWindowTitle("My Title") 
# Add the standard buttons "Ok" and "Cancel" 
msg.setStandardButtons(QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel) 

# Here, I tried to connect a function without argument, it works. 
msg.buttonClicked.connect(msgbtn) 

Deshalb an dieser Stelle habe ich "Ok" oder zurück in einem String "Abbrechen", und es ist gut . Ich möchte jedoch ein zusätzliches Argument zu dieser verbundenen Funktion hinzufügen (msgbtn). Ich habe den Befehl "type (i)" in der msnbtn und die i-Objekt-Klasse ist QPushButton. Das Problem ist, dass ich kein Attribut der Nachrichtenbox gefunden habe, das zu dieser Klasse gehört ... Ich habe die standardButton() gefunden, die die StandardButton-Klassenobjekte "Ok" und "Cancel" zurückgibt, und sie haben kein Textattribut.

durch dieses Problem zu gehen, habe ich versucht, dies:

def msgbtn(i, extra_arg): 
    print(i) 
    print(extra_arg) 


msg.buttonClicked.connect(lambda: msgbtn(msg.result(), my_arg)) 

Diese Methode des QMessageBox (Qt5 doc) liefert 1024, wenn "OK" gedrückt wird und 4194304 wenn "Abbrechen" gedrückt wird.

Ich kann damit umgehen, um weiter zu gehen, aber ich frage Sie, dass jemand weiß, welches Objekt der MessageBox als Argument übergeben wird, wenn ich anrufen msg.buttonClicked.connect (msgbtn)?

Antwort

1

Das Signal buttonClicked sendet die Schaltfläche, auf die geklickt wurde. Die Dokumentation zeigt, dass der Parameter vom Typ QAbstractButton ist. Dies ist eine abstrakte Basisklasse, die von der Klasse QPushButton geerbt wird.

Ihr Beispiel-Code kann wie folgt festgesetzt:

def msgbtn(button, arg): 
    print(button.text()) 
    print(arg) 

msg.buttonClicked.connect(lambda button, arg=my_arg: msgbtn(button, arg)) 

Dieser speichert den aktuellen Wert von my_arg als Standardargument der lambda.