興味があろうがなかろうが。

なるべく役に立つ、とがった内容を記していきたいと思います。

【FreeCADプログラミング】PyQtを使用したウインドウ表示

本日のお題は『PyQtを使用したウインドウ表示』です。

これまでの学習では、ユーザが値を指定するような操作が無く、プログラム上の固定値を使用していましたが、これではパラメトリックなコマンドを作ることができません。

というわけで今回は、標準搭載されているPyQtを利用して、GUIのアプリケーションを作成していきたいと思います。

1. 環境

  • FreeCAD 0.18

2. PyQtのバージョン

UI作成時に使用するPyQtのバージョンですが、上記FreeCAD 0.18においては、『PyQt5』が使えるようになっています。

wiki.freecadweb.org

3. PyQt4は入れられない?

ちなみに以前、デバッグ用にptvsdをインストールする際用いた、pipコマンドを使用して、PyQt4をインストールしようとすると、同梱されているPythonにあうバージョンが無いと怒られます。

> python -m pip install PyQt4

下記実行結果です。

> Could not find a version that satisfies the requirement PyQt4 (from versions: )
No matching distribution found for PyQt4

www.interested-or-not.com

というわけでここは騒がず、PyQt5を粛々と使用していきましょう。

4. プログラムを書いてみよう

まずは基礎となる『Hello World!』のラベルが貼られたUIを作成してみましょう。

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
 
class MainDialog(QWidget):
	def __init__(self, parent=None):
		super(MainDialog, self).__init__(parent)
		
		# ダイアログ
		self.setGeometry(100, 100, 250, 80)
		self.setWindowTitle('Hello World!')
		
		# ラベル
		self.label = QLabel(self)
		self.label.move(20, 20)
		self.label.resize(60, 40)
		self.label.setText('Hello World!')
				
if __name__ == '__main__':
	app = QApplication(sys.argv)
	mainDlg = MainDialog()
	mainDlg.show()
	app.exec_()

5. 実行結果

以下のようにHello World!のラベルが貼られたウインドウが表示されます。

f:id:appli-get:20201104233518p:plain

実行後のイメージ

6. 懸念事項

PyQtを使用するにあたり、少々気になった点があります。

  • プログラム終了後、FreeCADのアプリケーションメニューがグレーアウトされる。

f:id:appli-get:20201104233920p:plain

実行後にメニューがグレーアウトされてしまう

これは現状、何が原因で発生しているのか不明です。ちなみに、グレーアウトされてはいるものの、通常時と同様に選択することはできます。
(見た目だけグレーアウトされているだけ?)

何か掴めたら、本記事に追記します。

7. まとめ

  • FreeCADのGUIアプリケーションにはPyQtを使うことができる。
  • FreeCAD 0.18に同梱されているPyQtのバージョンは『5』。

8. 最後に

PyQtはあくまでUIの手段であって、やはり重要なのはこれまで学習してきた『ベクトルの計算』や『履歴の扱い方』などです。

PyQtを有益に扱うためにも、これまで記事にしてきた内容をしっかり覚えておきたいものです(自分への戒め)。

9. ソースコードについて

筆者はPyQtに関してあまり詳しくないため、おかしなソースコードが混じるかもしれません。もし何かお気づきの際は、コメントを頂けると幸いです。

更なる情報をお探しの方は!

下記のリンクから、FreeCADプログラミングのトップページに飛びます。

よろしければご参照くださいませ。

www.interested-or-not.com