PyQt について知ったとき、疑問に思ったことが 3 つあります。これは2番目のものに関する質問ですが、他の誰かが興味を持っている場合に備えて、3つすべてに名前を付けさせてください。
- まず、Python で C++ クラスをサブクラス化し (いわば)、Python で C++ メソッドをオーバーライドし、クラスを Qt フレームワークに戻すことができます。Qt フレームワークはそれらを C++ のように呼び出します!
- 第二に、スロット。コア Qt では、C++ クラスのメソッドです。しかし、PyQt では、Python メソッドをスロットとして簡単に使用でき、それらが呼び出されます。(ただし、Qt の「イントロスペクション」システムでは表示されないようです*) )
- 第三に、信号。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 シグナルも一覧表示されません。)