Als ich von PyQt erfuhr, gab es drei Dinge, über die ich mich wundern musste. Das ist die Frage über die zweite, aber lassen Sie mich nennen alle drei nur für den Fall, wenn jemand neugierig sein würde:Wie macht PyQt seine Magie? Wie können wir Slots in Python implementieren?
- erste, dürfen wir die C++ Klassen in Python zu Unterklasse (so zu sagen), überschreiben die C++ - Methoden in Python - und unsere Klassen zurück zu dem Qt-Framework, übergeben, die sie so nennen werden, wie sie C++ waren!
- Sekunde, die Schlitze. in Core Qt sind sie Methoden einer C++ Klasse. aber in PyQt können wir einfach Python-Methoden als Slots verwenden, und sie werden aufgerufen. (Sie scheinen nicht für das Qt "Introspektion" -System sichtbar zu sein, aber die Signale. 3). In Qt sind sie statisch generierter C++ - Code - wie also ist PyQt so schlau, dass wir sie (a) in Python und (b) im Prinzip on-the-fly erstellen können?
Ich glaube, ich verstehe (1) (für jede Klasse mit virtual
Methoden, SIP eine Unterklasse erzeugt, die es erbt, eine Referenz auf das Objekt Python zu halten, so dass der generierte Code für jede überschriebene Methode überprüft zunächst, ob ein Python-Methode existiert), und (3) sollte nicht zu schwer zu verstehen wissen (2).
Wie aus this article folgt, haben (2) haben wir die qt_metacall()
Methode für unsere Python-Klasse zu implementieren und an die Qt „Metasystem“ zu verknüpfen, indem eine entsprechende QMetaObject für unsere PyQt Klasse bieten.
Ich bin dankbar für Hinweise, wie es gemacht wird, entweder in PyQt oder PySide, oder wie es früher für PySide mit Boost :: Python gemacht wurde.
Insbesondere frage ich mich, was PyQt4.QtCore.SLOT() als Signaturzeichenfolge für eine entsprechende Python-Methode verwendet.
PS. Wie in einem related post gesagt wurde, "diese Frage is already asked in diesem Forum, aber ich verstehe das Konzept nicht".
*) Der folgende Code listet die Steckplätze für ein Qt-Objekt auf; Nicht so unerwartet, Python-Objektmethoden werden in dieser Liste nicht angezeigt, auch wenn sie connect() - ed sind. (Gibt es eine Möglichkeit, eine Liste von Python Methoden zu machen, die zur Zeit als Schlitze arbeiten?)
def print_object_slots(qt_object, this_class_only = False):
# there was a method called signalNames(), and, I suspect, slotNames(),
# but it was removed in Qt 4 [ http://www.qtforum.org/article/33122/method-qmetaobject-signalnames-removed-in-qt4.html#post106693 ]
mo = qt_object.metaObject()
nmethods = mo.methodCount()
first_method_offset = 0
if this_class_only :
first_method_offset = mo.methodOffset() # assert != -1
# or use PyQt.QtCore.QMetaMethod.Slot
type_slot = 2 # [ http://doc.qt.nokia.com/4.6/qmetamethod.html#MethodType-enum ]
# list the slots
for i in xrange(first_method_offset, nmethods):
meth = mo.method(i)
if meth.methodType() == type_slot :
print meth.signature()
(Verwendung 1 statt 2 zur Liste Signalen und -. Nein, PyQt Signale einer Klasse (PyQt4.QtCore.pyqtSignal()
diejenigen) wird auch nicht aufgelistet.)