pyqt5 チュートリアル
pyqt5を使い始める
サーチ…
備考
このセクションでは、pyqt5の概要と、開発者がpyqt5を使用する理由について概説します。
また、pyqt5内の大きなテーマについても言及し、関連するトピックにリンクする必要があります。 pyqt5のドキュメンテーションは新しいので、これらの関連トピックの初期バージョンを作成する必要があるかもしれません。
インストールまたはセットアップ
- Anacondaをインストールする(PyQt5はビルドイン)、特にWindowsユーザ向けです。
- PyCharmにQtDesignerとQtUIConvertを統合する(外部ツール)
- デモを書く
- 外部ツールによる新しいwindow.ui(QtDesigner)
- 外部ツール(PyUIConv)でwindow.pyに変換する
- デモ
import sys from PyQt5.QtWidgets import QApplication,QMainWindow from window import Ui_MainWindow if __name__ == '__main__': app = QApplication(sys.argv) w = QMainWindow() ui = Ui_MainWindow() ui.setupUi(w) w.show() sys.exit(app.exec_())
Hello Worldの例
この例では、レイアウト内にボタンとライン編集を含む簡単なウィンドウを作成します。また、信号をスロットに接続する方法も示されているため、ボタンをクリックするとテキストが行編集に追加されます。
import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __name__ == '__main__':
app = QApplication(sys.argv)
w = QWidget()
w.resize(250, 150)
w.move(300, 300)
w.setWindowTitle('Hello World')
w.show()
sys.exit(app.exec_())
分析
app = QtWidgets.QApplication(sys.argv)
すべてのPyQt5アプリケーションは、アプリケーションオブジェクトを作成する必要があります。 sys.argvパラメータは、コマンドラインからの引数のリストです。 Pythonスクリプトはシェルから実行できます。
w = QWidget()
QWidget
ウィジェットは、PyQt5のすべてのユーザインタフェースオブジェクトの基本クラスです。 QWidget
のデフォルトのコンストラクタを提供します。デフォルトのコンストラクタには親がありません。親を持たないウィジェットはウィンドウと呼ばれます。
w.resize(250, 150)
resize()
メソッドは、ウィジェットのサイズを変更します。幅250ピクセル、高さ150ピクセルです。
w.move(300, 300)
move()
メソッドは、ウィジェットをx = 300、y = 300の座標で画面上の位置に移動します。
w.setWindowTitle('Hello World')
ここでは、ウィンドウのタイトルを設定します。タイトルはタイトルバーに表示されます。
w.show()
show()
メソッドはウィジェットを画面に表示します。ウィジェットはまずメモリに作成され、後で画面に表示されます。
sys.exit(app.exec_())
最後に、アプリケーションのメインループに入ります。この時点からイベント処理が開始されます。メインループはウィンドウシステムからイベントを受け取り、アプリケーションウィジェットにディスパッチします。 mainループは、 exit()
メソッドを呼び出すか、メインウィジェットが破棄された場合に終了します。 sys.exit()
メソッドは、クリーンな終了を保証します。環境には、アプリケーションの終了方法が通知されます。
exec_()
メソッドにはアンダースコアがあります。これは、execがPythonキーワードであるためです。したがって、代わりにexec_()
が使用されました。
アプリケーションアイコンの追加
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 300, 220)
self.setWindowTitle('Icon')
self.setWindowIcon(QIcon('web.png'))
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
分析
Pythonの関数引数
Pythonでは、ユーザ定義関数は4種類の引数を取ることができます。
- デフォルトの引数:
関数定義
def defaultArg( name, msg = "Hello!"):
関数呼び出し
defaultArg( name)
- 必要な引数:
関数定義
def requiredArg (str,num):
関数呼び出し:
requiredArg ("Hello",12)
- キーワード引数:
関数定義
def keywordArg( name, role ):
関数呼び出し
keywordArg( name = "Tom", role = "Manager")
または
keywordArg( role = "Manager", name = "Tom")
- 変数の数:
関数定義
def varlengthArgs(*varargs):
関数呼び出し
varlengthArgs(30,40,50,60)
class Example(QWidget):
def __init__(self):
super().__init__()
...
オブジェクト指向プログラミングの3つの重要なことは、クラス、データ、およびメソッドです。ここではExample
という新しいクラスを作成します。 Example
クラスは、 QWidget
クラスから継承しQWidget
。つまり、 Example
クラスの最初のコンストラクタと継承したクラスの2番目のコンストラクタという2つのコンストラクタを呼び出します。 super()
メソッドは、 Example
クラスの親オブジェクトを返し、そのコンストラクタを呼び出します。 self
変数はオブジェクト自体を参照します。
なぜ私たちは__init__
を使用しましたか?
これをチェックしてください:
class A(object):
def __init__(self):
self.lst = []
class B(object):
lst = []
今すぐ試してみてください:
>>> x = B()
>>> y = B()
>>> x.lst.append(1)
>>> y.lst.append(2)
>>> x.lst
[1, 2]
>>> x.lst is y.lst
True
この:
>>> x = A()
>>> y = A()
>>> x.lst.append(1)
>>> y.lst.append(2)
>>> x.lst
[1]
>>> x.lst is y.lst
False
このことはクラスBのxがインスタンス化前に確立されていることを意味しますか?
はい、クラス属性です(インスタンス間で共有されます)。一方、クラスAではインスタンス属性です。
self.initUI()
GUIの作成は、 initUI()
メソッドに委譲されます。
self.setGeometry(300, 300, 300, 220)
self.setWindowTitle('Icon')
self.setWindowIcon(QIcon('web.png'))
3つのメソッドはすべてQWidget
クラスから継承されていQWidget
。 setGeometry()
は2つのことを行います:画面上にウィンドウを配置し、サイズを設定します。最初の2つのパラメータは、ウィンドウのxとyの位置です。 3番目は幅、4番目はウィンドウの高さです。実際には、1つのメソッドでresize()
move()
メソッドとmove()
メソッドを組み合わせています。最後の方法は、アプリケーションのアイコンを設定します。これを行うために、 QIcon
オブジェクトを作成しました。 QIcon
は、表示されるアイコンへのパスを受け取ります。
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
アプリケーションオブジェクトとサンプルオブジェクトが作成されます。メインループが開始されます。
ツールチップを表示する
import sys
from PyQt5.QtWidgets import (QWidget, QToolTip,
QPushButton, QApplication)
from PyQt5.QtGui import QFont
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
QToolTip.setFont(QFont('SansSerif', 10))
self.setToolTip('This is a <b>QWidget</b> widget')
btn = QPushButton('Button', self)
btn.setToolTip('This is a <b>QPushButton</b> widget')
btn.resize(btn.sizeHint())
btn.move(50, 50)
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Tooltips')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
分析
QToolTip.setFont(QFont('SansSerif', 10))
この静的メソッドは、ツールチップをレンダリングするために使用されるフォントを設定します。 10pxのSansSerifフォントを使用します。
self.setToolTip('This is a <b>QWidget</b> widget')
ツールチップを作成するには、 setTooltip()
メソッドを呼び出します。リッチテキスト形式を使用できます。
btn = QPushButton('Button', self)
btn.setToolTip('This is a <b>QPushButton</b> widget')
プッシュボタンウィジェットを作成し、ツールチップを設定します。
btn.resize(btn.sizeHint())
btn.move(50, 50)
ボタンがサイズ変更され、ウィンドウ上を移動します。 sizeHint()
メソッドは、ボタンの推奨サイズを示します。
プロジェクトを変更可能/インストーラにパッケージ化する
cx_Freeze - プロジェクトをexcutable / installerにパッケージ化するツール
- pipでインストールした後に
demo.py
をパッケージdemo.py
には、以下のsetup.py
が必要です。
import sys
from cx_Freeze import setup, Executable
# Dependencies are automatically detected, but it might need fine tuning.
build_exe_options = {
"excludes": ["tkinter"],
"include_files":[('./platforms','./platforms')] # need qwindows.dll for qt5 application
}
# GUI applications require a different base on Windows (the default is for a
# console application).
base = None
if sys.platform == "win32":
base = "Win32GUI"
setup( name = "demo",
version = "0.1",
description = "demo",
options = {"build_exe": build_exe_options},
executables = [Executable("demo.py", base=base)])
- ビルドする
python .\setup.py build
- 次にdist
python .\setup.py bdist_msi