PySide/ja
PySide
PySideはクロスプラットフォームのGUIツールキットQtのPythonバインディングです。 FreeCADはPython内部のすべてのGUI(Graphic User Interface)目的にPySideを使用します。 PySideは、以前にFreeCADによってGUIに使用されていたPyQtパッケージに代わるものです。 PySideはより許容されるライセンスを持っています。 違いの詳細についてはPySideとPyQtの違いを参照してください。
FreeCAD内部からPyQtモジュールを使用することでFreeCADのインターフェイスを完全に制御することができます。例えば以下のことを行うことができます。
- 独自のパネル、ウィジット、ツールバーの追加
- 既存のパネルへの要素の追加や非表示
- 全ての要素の間のコネクションに対する変更、リダイレクト、追加
PyQtには豊富なAPIドキュメントがあり、またネット上にはどの様にそれが動作するのか教えてくれるチュートリアルがたくさんあります。
もしFreeCADインターフェイスをいじりたいのであれば一番最初にやるべきことはFreeCADのメインウィンドウの参照を作成することです:
import sys from PyQt4 import QtGui app = QtGui.qApp mw = app.activeWindow()
すると例えばインターフェイスの全てのウィジットをブラウジングすることなどができるようになります:
for child in mw.children(): print 'widget name = ', child.objectName(), ', widget type = ', child
Qtインターフェイスのウィジットは普通、"コンテナ"ウィジット内に入れ子状態になっています。つまりメインウィンドウの子ウィンドウ自体も他の子ウィンドウを収納できるのです。ウィジットのタイプによって行えることは様々です。何ができるのかについてはAPIドキュメントをチェックしてください。
新しいウィジットの追加には例えばdockWidget(FreeCADのサイドパネルの一つに配置できます)が便利です:
myWidget = QtGui.QDockWidget() mw.addDockWidget(QtCore.Qt.RightDockWidgetArea,myWidget)
さらにいろいろなものをウィジットに直接追加できます:
myWidget.setObjectName("my Nice New Widget") myWidget.resize(QtCore.QSize(300,100)) # ウィジットのサイズ設定 label = QtGui.QLabel("Hello World", myWidget) # ラベルを作成 label.setGeometry(QtCore.QRect(50,50,200,24)) # そのサイズを設定 label.setObjectName("myLabel") # 名前を設定することで名前を使って検索できるようにします
しかしよく好まれる方法は一度にウィジットの設定を全て行えるUIオブジェクトの作成です。この方法の大きな利点はQt Designerを使うことでこういったUIオブジェクトをグラフィカルな方法で作成できるということです。Qt Designerによって生成された標準的なオブジェクトは以下のようになります:
class myWidget_Ui(object): def setupUi(self, myWidget): myWidget.setObjectName("my Nice New Widget") myWidget.resize(QtCore.QSize(300,100).expandedTo(myWidget.minimumSizeHint())) # ウィジットのサイズを設定 self.label = QtGui.QLabel(myWidget) # ラベルを作成 self.label.setGeometry(QtCore.QRect(50,50,200,24)) # そのサイズを設定 self.label.setObjectName("label") # 名前を設定することで名前を使って検索できるようにします def retranslateUi(self, draftToolbar): # ウィジットの翻訳を管理する組み込みのQt関数 myWidget.setWindowTitle(QtGui.QApplication.translate("myWidget", "My Widget", None, QtGui.QApplication.UnicodeUTF8)) self.label.setText(QtGui.QApplication.translate("myWidget", "Welcome to my new widget!", None, QtGui.QApplication.UnicodeUTF8))
使用するには以下のようにして新しく作成したウィジットに適用するだけで構いません:
myNewFreeCADWidget = QtGui.QDockWidget() # 新しいウィジットを作成 myNewFreeCADWidget.ui = myWidget_Ui() # UIスクリプトをロード myNewFreeCADWidget.ui.setupUi(myNewFreeCADWidget) # UIを設定 FCmw.addDockWidget(QtCore.Qt.RightDockWidgetArea,myNewFreeCADWidget) # メインウィンドウにウィジットを追加
print 'Hello World'
Pythonのprint文では、見た目や振る舞いを制御できるのは限られています。 PySideは、不足しているコントロールを提供し、Pythonの組み込み機能では不十分な環境(FreeCADマクロファイル環境など)も処理します。
PySide's abilities range from:
to:
PySideは次の3ページで説明されていますが、それらは相互に従う必要があります。
- Beginner PySide Examples (Hello World, announcements, enter text, enter number)
- Medium PySide Examples (window sizing, hiding widgets, popup menus, mouse position, mouse events)
- Advanced PySide Examples (widgets etc.)
彼らは主題を3つの部分に分け、PySide、PythonそしてFreeCAD内部への露出のレベルによって区別しました。最初のページには概要と背景資料があり、PySideとそのまとめ方について説明していますが、2ページ目と3ページ目は、ほとんどが異なるレベルのコード例です。
その意図は、問題に取り組むユーザがコードを簡単にコピーして自分の作業に貼り付け、必要に応じてそれを修正し、FreeCADによる問題解決に戻ることができるように、関連ページがPySideを実行する単純なPythonコードを提供することです。うまくいけば、彼らはPySideの質問に対する答えを探すためにインターネットを越えて追いかけに行く必要はありません。同時にこのページは、Web上で利用可能なさまざまな包括的なPySideチュートリアルと参照サイトを置き換えることを意図していません。