2012-04-09 59 views
2

當我瞭解到PyQt時,有三件事讓我想起。這是關於第二個問題,但讓我命名所有三個以防萬一,如果其他人會好奇:PyQt如何發揮它的魔力?特別是,它如何讓我們在Python中實現插槽?

  1. 第一,我們被允許繼承了C++類在Python(這麼說), 覆蓋Python中的C++方法 - 並將我們的類傳遞迴Qt框架,,它們會將它們稱爲C++!
  2. 秒,插槽。在覈心Qt中,它們是C++類的方法。但是在PyQt中,我們可以很容易地將Python方法用作插槽,並且它們會被調用。 (他們似乎對於Qt「內省」系統不可見,儘管*)
  3. 第三,信號。在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()者)將不會被列出。)

回答

0

您可以在現代版本的PyQt中使用裝飾器。例如:在the PyQt 4.9.4 docs

@QtCore.pyqtSlot() 
@QtCore.pyqtSlot('bool') 
def coolSlotActions(self, b=True): 
    """ my slot called, with two different signatures """ 
    pass # do something cool! 

更多信息。據我所知,這不適用於Pyside。

相關問題