2

PyQt について知ったとき、疑問に思ったことが 3 つあります。これは2番目のものに関する質問ですが、他の誰かが興味を持っている場合に備えて、3つすべてに名前を付けさせてください。

  1. まず、Python で C++ クラスをサブクラス化し (いわば)、Python で C++ メソッドをオーバーライドし、クラスを Qt フレームワークに戻すことができます。Qt フレームワークはそれらを C++ のように呼び出します!
  2. 第二に、スロット。コア Qt では、C++ クラスのメソッドです。しかし、PyQt では、Python メソッドをスロットとして簡単に使用でき、それらが呼び出されます。(ただし、Qt の「イントロスペクション」システムでは表示されないようです*) )
  3. 第三に、信号。Qt では、それらは静的に生成された C++ コードです。では、PyQt はどのようにして (a) Python で、(b) 基本的にオンザフライで作成できるほどスマートなのでしょうか?

私は(1)(virtualメソッドを持つすべてのクラスについて、SIPはそれを継承するサブクラスを生成し、Pythonオブジェクトへの参照を保持するため、オーバーライドされたすべてのメソッドに対して生成されたコードは最初にPythonメソッドが存在するかどうかをチェックします)、および( 3) (2) を知っていることを理解するのは難しくありません。

この記事からわかるように、(2) を実現するにqt_metacall()は、Python クラスのメソッドを実装し、PyQt クラスに対応する QMetaObject を提供して Qt の「メタシステム」にリンクする必要があります。

PyQt または PySide のいずれかで、または以前に Boost::Python を使用して PySide でどのように行われたかについてのヒントに感謝します。

特に、対応する Python メソッドの署名文字列として PyQt4.QtCore.SLOT() が何を使用するのか疑問に思います。

PS。関連する投稿で述べたように、「この質問はこのフォーラムで既に尋ねられていますが、概念がわかりません」。


*) 以下のコードは、Qt オブジェクトのスロットをリストしています。それほど予想外ではありませんが、Python オブジェクト メソッドは、たとえそれらが connect() されていたとしても、このリストには表示されません。(現在スロットとして機能している 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()

(シグナルを一覧表示するには、2 ではなく 1 を使用します。また、クラス ( PyQt4.QtCore.pyqtSignal()ones ) の PyQt シグナルも一覧表示されません。)

4

1 に答える 1

0

PyQt の最新バージョンではデコレータを使用できます。例えば:

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

詳細については、PyQt 4.9.4 docsを参照してください。私の知る限り、これは pyside では機能しません。

于 2012-07-30T02:35:55.850 に答える