2016-09-29 4 views
0

Ich habe ein paar Fragen bezüglich qDialogButtonBox. Während immer noch mein Code funktioniert, glaubte ich, dass es ein paar Teile, die raffinierte besser sein kann/ich nicht viel Informationen finden bin OnlinePyQt - QDialogButtonBox Signale und Tooltipp

class testDialog(QtGui.QDialog): 
    def __init_(self, parent=None): 
     ... 
     self.init_ui() 
     self.signals_connection() 

    def init_ui(self): 
     ... 
     self.buttonBox = QtGui.QDialogButtonBox() 
     self.buttonBox.addButton("Help", QtGui.QDialogButtonBox.HelpRole) 
     self.buttonBox.addButton("Apply", QtGui.QDialogButtonBox.AcceptRole) 
     self.buttonBox.addButton("Cancel", QtGui.QDialogButtonBox.RejectRole) 
     # 

    def signals_connection(self): 
     self.test_random.clicked.connect(self.test_rand) 

     # Is this the latest/correct way to write it? 
     self.buttonBox.accepted.connect(self.test_apply) 
     self.buttonBox.rejected.connect(self.test_cancel) 
     self.buttonBox.helpRequested.connect(self.test_help) 

    def test_apply(self): 
     print "I am clicking on Apply" 

    def test_cancel(self): 
     print "I am clicking on Cancel" 
     self.close() 

    def test_help(self): 
     print "I am clicking for Help!" 

Meine Fragen sind wie folgt:

  1. Unter meiner Funktion - signals_connection(), die Zeilen, die ich für schrieb die buttonBox (obwohl der Code funktioniert noch) sind ganz anders für das Signal I für die self.test_random geschrieben haben, und ich bin nicht in der Lage eine ähnliche online für die QDialogButtonBox zu finden .. Es ist ein anderer Stil, den ich habe und - self.connect(self.buttonBox, QtCore.SIGNAL("accepted()"), self, QtCore.SLOT("accept()")) aber ich denke, das ist der alte Stil ?? Sonst was sollte der richtige Weg sein es zu schreiben?
  2. In meiner test_cancel() Funktion schreibt self.close() der beste Weg, um die Anwendung zu schließen? Die Art und Weise, dass ich mein Programm laufen soll, wie folgt:

    dialog = testDialog();dialog.show()

  3. Schließlich ist es möglich, 3 Tipps anderes Werkzeug an die 3 Tasten hinzuzufügen ich geschaffen habe? Ich habe gesehen, dass es einen Befehl dafür gibt - self.buttonBox.setToolTip("Buttons for life!"), aber dies wird dazu führen, dass alle 3 Tasten dieselbe Werkzeugspitze haben. Kann ich es als Individuum machen?

Antwort

1
  1. Ja, das ist der richtige Weg, Signalverbindungen (die andere Syntax Sie ist in der Tat die alte Art und Weise, es zu tun gefunden) zu schreiben. Sie finden alle Signale in der pyqt-Dokumentation für QDialogButtonBox. Verschiedene Widgets und Objekte haben unterschiedliche Signale. QPushButton 's und QDialogButtonBox haben unterschiedliche Signale.

  2. Ja, close() schließt den Dialog. Die QApplication wird standardmäßig beendet, wenn keine anderen Fenster geöffnet sind. Wenn es sich jedoch um einen modalen Dialog handelt, möchten Sie normalerweise einen Dialog mit dem Befehl accept oder reject schließen. Dadurch wird die aufrufende Funktion gewarnt, ob der Dialog mit der Schaltfläche Ok/Yes/Apply geschlossen oder mit der Schaltfläche 'Nein/Abbrechen' geschlossen wurde.

  3. Sie können verschiedene QuickInfos für verschiedene Schaltflächen im QDialogButtonBox festlegen. Sie müssen nur einen Verweis auf die Schaltfläche erhalten, für die Sie die QuickInfo festlegen möchten.

Zum Beispiel

self.buttonBox.button(QDialogButtonBox.Help).setToolTip('Help Tooltip') 
self.buttonBox.button(QDialogButtonBox.Ok).setToolTip('Apply Tooltip') 

Oder Sie könnten eine Schleife durch alle Tasten

for button in self.buttonBox.buttons(): 
    if button.text() == 'Help': 
     button.setToolTip('Help Tooltip') 
    elif button.text() == 'Apply': 
     button.setToolTip('Apply Tooltip') 

Auch könnten Sie die accepted und rejected Signale von der QDialogButtonBox den accept und reject Schlitze verbinden auf der QDialog

self.buttonBox.accepted.connect(self.accept) 
self.buttonBox.rejected.connect(self.reject) 

Auf diese Weise müssen Sie die Schaltflächen Ok und Cancel nicht manuell mit Ihren Rückrufen verbinden, um den Dialog zu schließen.

+0

danke für die beschreibenden Informationen. Da ich nicht die Standard-Buttons der QDialogButtonBox verwende, sondern meine Buttons manuell mit 'addButton' erstelle, scheint es so, als könnte ich die erste Methode zum Setzen des Tooltips, die du erwähnt hast, nicht verwenden. Allerdings funktioniert es, wenn ich es über den Text schleife, was super funktioniert! Mit 'self.close()' oder 'self.buttonBox.rejected.connect (self.reject)', obwohl Sie erwähnt haben, dass die Anwendung immer noch geschlossen wird, aber wird es irgendwo im Speicher existieren? – dissidia

+0

@dissidia Ja, wenn Sie immer noch einen Verweis auf den Dialog haben, wird das Dialogobjekt weiterhin existieren und Sie können immer noch auf seine Untersteuerelemente und Widgets zugreifen. Wenn Sie Ihre Verweise darauf löschen, wird möglicherweise Müll gesammelt und nicht mehr existieren. –

+0

Was wird der beste Weg sein, um einen sauberen Abschluss der Anwendung zu machen? – dissidia