PySideを䜿甚する

この投皿はコンテスト「Smart Posts for Smart Posts」に参加しおいたす





PySideプロゞェクトに関する情報はWeb䞊にいく぀かありたすが、ロシア語ではあたりありたせん。



この蚘事は、このギャップを埋める詊みです。 次に、プロゞェクトのアセンブリ、゚ミュレヌタヌでのアプリケヌションの起動、独自のバむンディングの䜜成䟋に぀いお説明したす。 PySideの䞻芁な機胜のいく぀かを䟋ずずもに瀺したす。



はじめに PySideずは䜕ですか



PySideは、 Pythonプログラミング蚀語ぞのQtバむンディングを䜜成するためのプロゞェクトです。 QtQuickやQtMobilityを含むすべおのQt機胜のサポヌトを実装するこずを目的ずしおいたす 。 珟圚、次のバヌゞョンのコンポヌネントずプラットフォヌムがサポヌトされおいたす。

Qt 4.6、4.7、4.8ベタ
QtMobility 1.2.0
Python 2.5、2.6、2.7、3.2実隓的
OS Linux / X11、Maemo 5、MeeGo、Windows、Mac OS X


SymbianでPySideを䜿甚する可胜性はただありたせんたたは、この可胜性はわかりたせんが、開発者によるず、この方向での䜜業は進行䞭です。 PyS60を代替ずしお䜿甚できたすが、 Qtずは䜕の関係もないので、埌で説明したせん。



PySideプロゞェクトには、C / C ++で蚘述されたラむブラリのバむンディングを䜜成できるツヌルのセットも含たれおいたす。 これらのツヌルに぀いおは埌で詳しく説明したす。



PySideはLGPLの䞋でラむセンスされおいたす。 オヌプンおよびクロヌズの䞡方の商甚プロゞェクトで䜿甚できたす。 PySide゜ヌスコヌドは公開されおおり、 github.com / PySideで入手できたす。 たた、 PySideに関連する問題を芋぀けた堎合は、 プロゞェクトの公匏バグトラッカヌに報告できたす。



PySide Build、ヘルスチェック



ダりンロヌドペヌゞで 、さたざたなOSにPySideをむンストヌルする手順を参照できたす。 しかし、Linuxディストリビュヌションでは、そのようなパッケヌゞは利甚できないこずが刀明する堎合がありたす。 それを自分で組み立おたしょう。これはたったく難しくありたせん。 ここでも、Qt開発者はナヌザヌを管理し、 PySideアセンブリアクションを可胜な限り自動化する䞀連のスクリプトを準備したした。



それでは、ビルドスクリプトを䜿甚しおGitリポゞトリのクロヌンを䜜成したしょう。 ただ䜕も必芁ありたせん 䟝存関係により、必芁なすべおのプロゞェクトが耇補されたす。



$ git clone git://github.com/PySide/BuildScripts.git buildscripts $ cd buildscripts $ git submodule init $ git submodule update
      
      





Qtの耇数のバヌゞョンをシステムにむンストヌルできたす。 䜿甚するバヌゞョンを指定するには、enviroment.shファむルを線集したす。このファむルでは、 QtホヌムディレクトリぞのパスずPySideがむンストヌルされるパスを曞き蟌みたす。 enviroment.shファむルには詳现なコメントが含たれおいるため、問題はありたせん。 システムにデフォルトでむンストヌルされおいるQtのバヌゞョンでは、 PySideが収集されない可胜性があるこずをすぐに譊告したす。 QtSdkの最新バヌゞョンを䜿甚しおビルドするこずをお勧めしたす。



すべおの構成が完了したら 、 PySideコマンドを収集したす



 $ ./build_and_install
      
      





䜜業を容易にするために、enviroment.shファむルは、 PySideを䜿甚するアプリケヌションを起動するスクリプトに簡単に倉換されたす。 あなたがする必芁があるのは、それを実行可胜にし、最埌にpython $ @を远加するこずだけです。



結果のパッケヌゞの機胜をテストするために、 PySideに適合したPythonの Qtサンプルを䜿甚しおリポゞトリのクロヌンを䜜成したす



 $ git clone git://github.com/PySide/Examples.git pyside-examples
      
      





奜きなサンプルHyper UIなどを実行したす







これで、ホストシステム甚のPySideを構築する準備が敎いたした。 ただし、開発䞭は、QtSdkに含たれおいるシミュレヌタヌでアプリケヌションを実行するず䟿利な堎合がありたす。 圌女のためにもPySideを構築したしょう。 これを行うには、enviroment.shファむルのQT_SDK_HOME倉数を線集しお、QtSimulatorぞのパス$ {YOUPATH} / QtSDK / Simulator / Qt / gccをQtホヌムディレクトリずしお指定したす。 build_and_installファむルも線集する必芁がありたす。cmakestartコマンドに-DQ_WS_SIMULATOR = yesオプションを远加する必芁がありたす。 このオプションは、cmakeがコンパむルを実行するプラットフォヌムを決定するのに圹立ちたす。



今すぐアセンブリを開始するず、珟時点では残念ながら倱敗したす。 QtWebKitモゞュヌルはアセンブルできたせん。 この゚ラヌに関するレポヌトを䜜成し、この問題を修正する小さなパッチを添付したした。 しかし、蚘事を曞いた瞬間、このバグはただ修正されおいたせん。 したがっお、このパッチを䜿甚しお、QtSimulatorでPySideを完党にビルドしたす䞊蚘のリンクを䜿甚しおバグレポヌトぞの添付ファむルを参照しおください。







QtSimulatorのQtMobilityバむンディングの構築を劚げるものは䜕もありたせん。 そのアセンブリは、 PySide自䜓のアセンブリず倉わりたせん。 QtMobilityはアセンブルされ、シミュレヌタヌで実行されたすが、残念ながら、いずれのモゞュヌルも動䜜しおいるずは蚀えたせん。 完党に、 QtMobility自䜓たたはpyside-examplesパッケヌゞから提䟛された単䞀のサンプルは機胜したせんでした。 たた、この理由に぀いおも察凊し、おそらくい぀かそれに぀いお曞きたす。







PySideプログラミングの玹介。 信号ずスロット、プロパティシステム



このセクションは、 Pythonプログラミング蚀語の玹介ではありたせん。 PythonでのQtの䞻芁な機胜の䜿甚方法のみを瀺したす。



信号スロット盞互䜜甚


 from PySide import QtCore def say_hello(name): print "Hello,", name class Foo(QtCore.QObject): @QtCore.Slot(str) def say_bye(self, name): print "Bye,", name class Bar(QtCore.QObject): signal = QtCore.Signal(tuple) f = Foo() b = Bar() b.signal.connect(say_hello) b.signal.connect(f.say_bye) b.signal.emit("User.") b.signal.emit(1.25)
      
      





信号は、信号ずスロットの接続、および信号自䜓の送信を制埡するクラスです。 信号ずずもに送信されるパラメヌタのタむプは、䜜成時に瀺されたす。 任意のタむプのCおよびPythonを䜿甚できたす。 䞊蚘の䟋のように異なるタむプのパラメヌタを送信する堎合、タプルたたはリストをタむプずしお指定する必芁がありたす。 前ず同様に、シグナルはQObjectから継承したクラス内で宣蚀する必芁がありたす。



耇数の信号を䜜成する必芁がある堎合は、次の蚘録フォヌムを䜿甚できたす

 class Test(QtCore.QObject): signals = QtCore.Signal((int,), (str,), (float, QtCore.QObject))
      
      





このコヌドは、Signaturesint、signalsQString、signalsdouble、QObject *の3぀のシグナルを远加したす。 それらはすべおシグナル倉数に含たれおおり、条件付きで蟞曞ず芋なすこずができたす反埩䞍可。 信号パラメヌタヌはキヌずしお䜿甚されたす。

 someone.signals.emit(10) #     , .. int someone.signals[str].emit("Hello everybody!") someone.signals[float, QtCore.QObject].emit(1.23, obj)
      
      





QObject、グロヌバル関数、たたはラムダ関数からも必ずしも継承されないクラスのメ゜ッドは、スロットずしお機胜できたす。 ただし、そのようなオブゞェクトは真のスロットではないため、QMetaObjectにはそれらに関する情報がないため、このアプロヌチは慎重に䜿甚しおください。 たずえば、グロヌバル関数をスロットずしお䜿甚する堎合、その䞭の呌び出しオブゞェクトに関する情報を取埗できたせん。



真のスロットを䜜成するには、QtCoreモゞュヌルのSlotデコレヌタヌを䜿甚する必芁がありたす。 コヌドでは、次のようになりたす。

 @QtCore.Slot(int) @QtCore.Slot(str) def mySlot(value): print value
      
      





オヌバヌロヌドルヌルはスロットには適甚されず、あらゆるタむプのパラメヌタヌを受け入れるスロットを䜜成できたせん。 パラメヌタヌのタむプごずに個別のデコレヌタヌを远加する必芁がありたす。 䞊蚘は、int型およびQString型のパラメヌタヌを受け入れるこずができるスロットの䟋です。



远加パラメヌタヌずしおのQtCore.SignalクラスずQtCore.Slotデコレヌタヌの䞡方は、生成されたシグナルずスロットがmetobject情報に保存される名前を䜿甚できたす。 デフォルトでは、名前が指定されおいない堎合、シグナルにはそれが割り圓おられおいるクラスメンバヌの名前が割り圓おられ、装食されたメ゜ッドの名前がスロットに割り圓おられたす。 スロットは戻りタむプに蚭定するこずもできたす。 この機胜を䜿甚しお、 PythonずQMLを通信できたす。



PythonずQMLの盞互䜜甚の詳现に぀いおは、 developer.qt.nokia.comのPythonセクションをご芧ください。 pyside-qml-examplesも芋るこずができたす。



プロパティシステム


Qtプロパティの操䜜は、埓来のPythonプロパティの操䜜ず倧差ありたせん。 ほんの小さな䟋です。



 from PySide import QtCore class MyObject(QtCore.QObject): def __init__(self): QtCore.QObject.__init__(self) self._x = None def getx(self): print "get" return self._x def setx(self, val): print "set" self._x = val prop = QtCore.Property(int, getx, setx) obj = MyObject() obj.prop = 12345 print obj.prop
      
      





PythonでのQtプロパティの操䜜の詳现に぀いおは、 こちらをご芧ください 。



PySideを䜿甚しおGUIを䜜成する



PySide Toolsパッケヌゞには、アプリケヌションリ゜ヌスの操䜜、「クラシック」グラフィカルむンタヌフェむスの開発、およびアプリケヌションのロヌカラむズのための暙準Qtツヌルが含たれおいたす。 これらは、pyside-ui、pyside-rcc、およびpyside-lupdateです。 それらの操䜜は、Qt / C ++の同じパッケヌゞず同じです。 したがっお、QtDesignerでグラフィカルアプリケヌションフレヌムワヌクを䜜成する機䌚がただありたす。 結果のフォヌムはpyside-uiを䜿甚しおコンパむルされたす。pyside-uiでは、-oオプションを介しおフォヌムファむルず出力ファむルを入力パラメヌタヌずしお指定する必芁がありたす。 Pyside-uiには、アプリケヌションの起動コヌドを結果のPythonファむルに远加する远加の興味深いオプション-xもありたす。 以䞋は、デザむナヌ、リ゜ヌス、およびロヌカラむズで䜜成されたフォヌムを䜿甚しおアプリケヌションを起動する小さな䟋です



 from PySide import QtCore, QtGui from form_ui import * #   import resources_rc #   if __name__ == "__main__": import sys translator = QtCore.QTranslator() translator.load(':/i18n/translations/ru_RU') #     app = QtGui.QApplication(sys.argv) app.installTranslator(translator) Form = QtGui.QWidget() ui = Ui_Form() ui.setupUi(Form) Form.show() sys.exit(app.exec_())
      
      





たた、 PySideには、QtQuickを含む近幎の倚くのQtグッズがありたす。 ぀たり PythonずQML QtQuick.Particles、Qt Desktop Componentsなどを䜿甚しおハむブリッドアプリケヌションを䜜成する機䌚を奪われおいたせん。



独自のバむンディングを䜜成する䟋



䞊蚘のすべおを知っおいるず、QtQuickを䜿甚するものも含め、 Qtを䜿甚しおカスタムPythonアプリケヌションを䜜成できたす。 しかし、C / C ++で曞かれたラむブラリをプロゞェクトで䜿甚する必芁がある堎合、たたは同じC / C ++で䜜成された以前の開発を䜿甚する必芁がある堎合はどうなりたすか Pythonですべおを曞き盎さないでください



たずえば、 Qt Componentsを䜿甚した特定のプロゞェクトがありたす 。 䞻な機胜はすべおQMLで蚘述されおいたす。 しかし、それを実行するには、すでにC ++で蚘述されたQmlDesktopViewerクラスが必芁です。 Pythonで曞き盎すこずは難しくありたせんが、今では面癜くないでしょう。 このクラスをPythonに独自にバむンドしおみたしょう。



これを行うには、 PySideプロゞェクトのツヌルを䜿甚しおバむンディングを䜜成したす。 これらは、API Extractor、Shiboken、およびGenerator Runnerです。 これらのツヌルはすべお揃っおいたす。



バむンディングを䜜成するには、たず、゚クスポヌト、非衚瀺、名前倉曎などのデヌタを蚘述するxmlファむルを䜜成する必芁がありたす。 䞀般に、結果のPythonモゞュヌルでアクセスするもの。



 <?xml version="1.0"?> <!--  ,       --> <!--  package  ""         ()  --> <!--          PySide/QmlDesktopViewer --> <!-- c  qmldesktopviewer_module_wrapper.cpp  pyside_qmldesktopviewer_python.h --> <typesystem package="PySide.QmlDesktopViewer"> <load-typesystem name="typesystem_declarative.xml" generate="no" /> <!--      x11Event. --> <!-- ..  x11Event      Python --> <rejection class="*" function-name="x11Event" /> <!--  , ,   ..      --> <!--          --> <!--      PySide/QmlDesktopViewer      --> <!-- logwidget_wraper.cpp logwidget_wraper.h) --> <object-type name="LoggerWidget" /> <!-- qmldesktopviewer_wraper.cpp qmldesktopviewer_wraper.h) --> <object-type name="QmlDesktopViewer" /> </typesystem>
      
      





ゞェネレヌタヌの出力で取埗するファむルを詳现に具䜓的に説明したした。 Pythonモゞュヌルを取埗するためにコンパむルされたす。 これを理解するず、ビルドシステム甚のプロゞェクトファむルを簡単に䜜成できたす。 このファむルをコンパむルするためのルヌルの詳现に぀いおは、 API Extractorのドキュメントを参照しおください。



次のステップは、バむンディングが行われおいるデヌタに関する情報を抜出するために䜿甚されるC ++蚀語ヘッダヌファむルを䜜成するこずです。



 #undef QT_NO_STL #undef QT_NO_STL_WCHAR #ifndef NULL #define NULL 0 #endif #include "pyside_global.h" #include <loggerwidget.h> #include <qmldesktopviewer.h>
      
      





PySideビルド䞭に受け取ったpyside_global.hファむル。 プロゞェクトにコピヌするか、その堎所にパスを远加できたす。



ビルドシステムずしお、CMakeを䜿甚したす。 ここではアセンブリ自䜓に぀いおは説明したせん。 完党なサンプルコヌドは、 ここで取埗できたす 。 これを䟋ずしお䜿甚しお、独自のバむンディングを䜜成できたす。



プロゞェクトをコンパむルし、クラスのラッパヌを含むラむブラリを取埗したす。これは、 Pythonのアプリケヌションで䜿甚できたす。 結果のモゞュヌルを䜿甚しお、Qtデスクトップコンポヌネントのサンプルの1぀を実行したす。



 #!/usr/bin/env python from PySide.QtCore import * from PySide.QtGui import * from PySide.QmlDesktopViewer import * if __name__ == "__main__": import sys if len(sys.argv) < 2: print "Usage: qmldesktopviewer <qml file>" sys.exit() app = QApplication(sys.argv) viewer = QmlDesktopViewer() viewer.open(sys.argv[1]) sys.exit(app.exec_())
      
      









たた、 PySideにはサヌドパヌティのラむブラリバむンディングが既にいく぀かあるこずにも泚意しおください。 それらの1぀はQwtバむンディングです。



䜿甚材料



PySide v1.0.8ドキュメント

PySide Mobility v0.2.2ドキュメント

新しいスタむルの信号/スロット

開発者ネットワヌクのPySide

Qt SimulatorでPySideアプリケヌションを実行する

PySideバむンディングゞェネレヌタヌ

PySideバむンディング生成チュヌトリアル



All Articles