2017-12-26 7 views
1


Ich lerne PyQt5 (was für mich ziemlich kompliziert aussieht) und ich frage mich, warum QMessageBox.Yes (oder keine) einigen besonderen Wert hat, für mich ist es 16384 ist. Das ist, was ich meine:Werte von QMessageBox.Yes/QMessageBox.No

from PyQt5 import QApplication, QWidget, QMessageBox 

class App(QWidget): 
    def message_box(self): 
     resp = QMessageBox.question(self, 'foo', 'bar', QMessageBox.Yes | QMessageBox.No, QMessageBox.No) 
     print(resp) 

Er druckt 16384 (wenn Sie auf Ja) oder 65536 (wenn Sie auf Nein klicken), warum nicht wahr oder falsch? Ich verstehe, dass ich es später vergleichen kann mit QMessageBox.Yes oder QMessageBox.No, aber ich frage mich, wo sind die magischen Werte aus und warum sie verwendet werden?

+0

Ein paar Minuten, die Sie mit der [QMessageBox-Dokumentation] (https://doc.qt.io/qt-5/qmessagebox.html#StandardButton-enum) verbracht haben, hätten schnell alle aufgedeckt. – ekhumoro

Antwort

1

Weil ja und nein sind nicht die einzigen Optionen. Was wäre, wenn Sie Ja, Nein, Abbrechen und Abbrechen wünschen (was für Ihre Anwendung alle unterschiedliche Bedeutungen hatte)? Sie können diese nicht mit einem einzigen booleschen Wert darstellen.

Also ist es üblich, eine ganze Zahl zu verwenden. Natürlich ist es nervig, sich daran zu erinnern, was jede ganze Zahl bedeutet, also werden sie in schön benannten Variablen gespeichert, damit Ihr Code lesbar bleibt!

Es gibt nichts Eigenes an den spezifischen Werten, außer der Tatsache, dass sie Potenzen von 2 (2^14 bzw. 2^16) sind, was es erlaubt, sie zu einer einzigen ganzen Zahl zu kombinieren, indem "bitweise oder" verwendet wird "Operation und dann später extrahiert aus der resultierenden Ganzzahl mit" bitweise und ". Dies ist eine gängige Methode zum Kombinieren von Optionsflags in einer einzelnen Variablen, sodass Sie einer Funktion/Methode nicht jedes Mal ein neues Argument hinzufügen müssen, wenn Sie eine Option hinzufügen (wichtig in Sprachen, in denen optionale Methodenargumente nicht möglich sind). Wenn Sie sich dessen nicht bewusst waren, haben Sie bereits die Bitwise oder die Flags im Nachrichtenboxkonstruktor kombiniert!

+0

Vielen Dank für Ihre Antwort! – m4k5

1

Wenn wir in der QT-Dokumentation suchen, können wir die folgenden für die QMessageBox.question Methode Rückgabewert lesen:

Gibt die Identität der Standardschaltfläche, die geklickt wurde.

Die Identität für jeden Standard-Schaltfläche ist eine ganze Zahl, die auch von der Dokumentation angegeben wird:

QMessageBox::Yes 0x00004000 QMessageBox::No 0x00010000

Wenn wir diese Hex-Werte in Dezimalzahlen konvertieren, wir Erhalten Sie 16384 und 65536.

warum nicht T rue oder Falsch?

Da gibt es viel mehr Möglichkeiten hier, gibt es viel mehr Standard-Tasten sind (ex. Ok, Öffnen, Speichern, Abbrechen, etc.)

mehr Informationen für Sie in der Dokumentation zu QT lesen sollten : http://doc.qt.io/qt-5/qmessagebox.html (ja, es ist für C++, aber es ist auch für die Python-Wrapper)