當我瞭解到PyQt時,有三件事讓我想起。這是關於第二個問題,但讓我命名所有三個以防萬一,如果其他人會好奇:PyQt如何發揮它的魔力?特別是,它如何讓我們在Python中實現插槽?
- 第一,我們被允許繼承了C++類在Python(這麼說), 覆蓋Python中的C++方法 - 並將我們的類傳遞迴Qt框架,,它們會將它們稱爲C++!
- 秒,插槽。在覈心Qt中,它們是C++類的方法。但是在PyQt中,我們可以很容易地將Python方法用作插槽,並且它們會被調用。 (他們似乎對於Qt「內省」系統不可見,儘管*))
- 第三,信號。在Qt中,它們是靜態生成的C++代碼 - 那麼PyQt是如此聰明以允許我們在Python中創建它們(a),以及基本上在飛行中創建它們?
我想我明白(1)(用於與virtual
方法的每個類,SIP生成繼承它的子類,保持到Python對象的引用,使得用於如果每重寫的方法首先檢查所生成的代碼Python方法存在)和(3)不應該太難理解(2)。
從this article開始,爲了讓(2)我們必須爲我們的Python類實現qt_metacall()
方法,並通過爲我們的PyQt類提供相應的QMetaObject將它鏈接到Qt「元系統」。
我會很感激PyQt或PySide中的任何提示,或者如何使用Boost :: Python爲PySide完成它。
特別是,我想知道PyQt4.QtCore.SLOT()用作相應Python方法的簽名字符串。
PS。正如在related post中所說,「這個問題is already asked在這個論壇,但我不明白這個概念」。
*)下面的代碼列出了一個Qt對象的插槽;沒有那麼出乎意料,Python對象方法不會顯示在此列表中,即使它們是connect() - ed。 (有沒有一種方法,使的它目前正在爲插槽Python方法列表?)
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()
(使用1而不是2到列表信號和 - 不,一類PyQt的信號(PyQt4.QtCore.pyqtSignal()
者)將不會被列出。)