PythonのGUIツールキットであるPyQtでの画面開発で使用できるQtWidgetsについて整理して紹介します。
Contents
PyQtの画面開発で使えるWidget
PyQtでは、画面の構成要素として使用できるウィジェットがQtWidgetsに多く用意されています。本記事ではPyQtで使える画面構成要素を一つ一つ紹介していきます。
PyQtでの画面開発のテンプレートとしては「QWidgetを継承した画面開発のテンプレート」「QMainWindowを継承した画面開発のテンプレート」で紹介しています。
本記事では「QWidgetを継承した画面開発テンプレート」をベースに各種ウィジェットを配置する方法を紹介しています。今回紹介するようなWidgetを画面配置していくことで色々な画面を開発できるようになります。
なお、ウィジェットが使えるようになるとレイアウト配置したくなってくるかと思いますが、レイアウトについては「ウィジェットのレイアウト方法」でもまとめていますので興味があれば参考にしてください。
QLabel:ラベル
基本的な使い方
ラベルを表示するための「QLabel」について紹介します。QLabelは、基本的には以下のように使用します。
import sys from PyQt6 import QtCore as qtc from PyQt6 import QtGui as qtg from PyQt6 import QtWidgets as qtw class MainWindow(qtw.QWidget): """メインウィンドウ""" def __init__(self): super().__init__() self.setWindowTitle("QLabel") self.resize(320, 240) # ===== QLabel 基本的な使い方 label = qtw.QLabel("QLabel サンプル", self) # 画面表示 self.show() def main(): """メイン関数""" app = qtw.QApplication(sys.argv) mv = MainWindow() sys.exit(app.exec()) if __name__ == "__main__": main()
【表示結果】
ラベルは、QLabelに表示する文字列を渡すことで使用します。以降で紹介する各種Widgetも同様ですが、親画面が分かるようにselfを指定します。
以降での使い方のバリエーションを紹介します。実行は上記プログラムをベースとして、定義部分を置き換えて使ってみてください。なお、以降で紹介する引数は一つ一つ紹介しますが、複数組み合わせで指定して使用可能です。
テキストを後で設定する setText
QLabelで表示する文字列については、setTextメソッドでQLabelを生成後に値を設定することができます。プログラムの処理の結果によりラベルを変更するとき等に使用できます。
# ===== QLabel テキストを後で設定する label = qtw.QLabel(self) label.setText("QLabel サンプル")
【表示結果】
インデントを設定する indent
QLabelで表示する文字列にインデントを設定する場合には、以下のようにindent引数に値を設定します。
# ===== QLabel インデントを設定する label = qtw.QLabel("QLabel サンプル", self, indent=50)
【表示結果】
マージンを設定する margin
QLabelで表示する文字列にマージンを設定する場合には、以下のようにmargin引数に値を設定します。
# ===== QLabel マージンを設定する label = qtw.QLabel("QLabel サンプル", self, margin=50)
【表示結果】
折り返しを設定する wordWrap=True
QLabelで表示する文字列に折り返しの設定をする場合には、wordWrap引数をTrueに設定します。
# ===== QLabel 折り返しを設定する label = qtw.QLabel("QLabel サンプル xxxxx yyyyy zzzzz", self, wordWrap=True)
【表示結果】
リッチテキストを表示する
QLabelは、リッチテキストを表示することも可能です。以下は、ボールド(太字)で文字列を表示している例です。
# ===== QLabel リッチテキストを表示 label = qtw.QLabel("<b>QLabel サンプル</b>", self)
【表示結果】
QLineEdit:エディット欄
基本的な使い方
利用者の入力欄(エディット欄)を表示するための「QLineEdit」について紹介します。QLineEditは、基本的には以下のように使用します。
import sys from PyQt6 import QtCore as qtc from PyQt6 import QtGui as qtg from PyQt6 import QtWidgets as qtw class MainWindow(qtw.QWidget): """メインウィンドウ""" def __init__(self): super().__init__() self.setWindowTitle("QLineEdit") self.resize(320, 240) # ===== QLineEdit 基本的な使い方 line_edit = qtw.QLineEdit(self) # 画面表示 self.show() def main(): """メイン関数""" app = qtw.QApplication(sys.argv) mv = MainWindow() sys.exit(app.exec()) if __name__ == "__main__": main()
【表示結果】
エディット欄のため利用者が値を入力することができます。入力された値を使ってプログラムのデータとして利用することが可能です。
以降での使い方のバリエーションを紹介します。実行は上記プログラムをベースとして、定義部分を置き換えて使ってみてください。なお、以降で紹介する引数は一つ一つ紹介しますが、複数組み合わせで指定して使用可能です。
デフォルト値を設定する
QLineEditは、第1引数に文字列を渡すことで以下のようにデフォルト値として値を設定した状態で画面表示することが可能です。
# ===== QLineEdit デフォルト値を設定する line_edit = qtw.QLineEdit("デフォルト値", self)
【表示結果】
プレースホルダーテキストの表示 placeholderText
入力欄(エディット欄)では、どういった入力をするべきか利用者が分かるようにプレースホルダーテキストを設定することがあります。プレースホルダーテキストとは、入力されるまでの間フィールドの内側に表示される説明文のことです。
QLineEditで、プレースホルダーテキストを設定したい場合は、以下のようにplaceholderText引数に文字列を指定します。
# ===== QLineEdit プレースホルダーテキストの表示 line_edit = qtw.QLineEdit(self, placeholderText="入力してください。")
【表示結果】
クリアボタンの表示 clearButtonEnabled=True
値が入力された際に簡単にクリアできるボタンを表示するには、以下のようにclearButtonEnabled引数をTrueを設定します。
# ===== QLineEdit クリアボタンの表示 line_edit = qtw.QLineEdit(self, clearButtonEnabled=True)
【表示結果】
最大文字数の指定 maxLength
QLineEditで入力させる最大文字数を指定したい場合は、以下のようにmaxLength引数に最大文字数を指定します。これにより、最大指定文字数以上は入力しようと思っても入力できなくなります。なお、文字数のため全角の日本語でも指定文字数分を入力できます。
# ===== QLineEdit 最大長の指定 line_edit = qtw.QLineEdit(self, maxLength=10)
【表示結果】
QTextEdit:テキストエディット欄
基本的な使い方
利用者のテキスト入力欄を表示するための「QTextEdit」について紹介します。QTextEditは、基本的には以下のように使用します。
import sys from PyQt6 import QtCore as qtc from PyQt6 import QtGui as qtg from PyQt6 import QtWidgets as qtw class MainWindow(qtw.QWidget): """メインウィンドウ""" def __init__(self): super().__init__() self.setWindowTitle("QTextEdit") self.resize(320, 240) # ===== QTextEdit 基本的な使い方 textedit = qtw.QTextEdit(self) # 画面表示 self.show() def main(): """メイン関数""" app = qtw.QApplication(sys.argv) mv = MainWindow() sys.exit(app.exec()) if __name__ == "__main__": main()
【表示結果】
QLineEditが1行であったのに対して、QTextEditはメモ帳などのように改行したりしてテキストを入力できます。
以降での使い方のバリエーションを紹介します。実行は上記プログラムをベースとして、定義部分を置き換えて使ってみてください。なお、以降で紹介する引数は一つ一つ紹介しますが、複数組み合わせで指定して使用可能です。
プレースホルダーテキストの表示 placeholderText
テキスト欄では、どういった入力をするべきか利用者が分かるようにプレースホルダーテキストを設定することがあります。プレースホルダーテキストとは、入力されるまでの間フィールドの内側に表示される説明文のことです。
QTextEditで、プレースホルダーテキストを設定したい場合は、以下のようにplaceholderText引数に文字列を指定します。
# ===== QTextEdit プレースホルダーテキストの表示 textedit = qtw.QTextEdit(self, placeholderText="テキストを入力してください。")
【表示結果】
折り返し設定 lineWrapMode, lineWrapColumnOrWidth
QTextEditで折り返し設定を指定したい場合は、以下のようにlineWrapMode引数にqtw.QTextEdit.LineWrapMode.FixedColumnWidthを設定し、lineWrapColumnOrWidth引数に文字数を設定します。なお、文字数のため全角の日本語でも指定文字数分で折り返しされます。
# ===== QTextEdit 折り返し設定 textedit = qtw.QTextEdit( self, lineWrapMode=qtw.QTextEdit.LineWrapMode.FixedColumnWidth, lineWrapColumnOrWidth=20, )
【表示結果】
テキストを入力した状態で表示 plainText
QTextEditで、テキストを入力した状態で表示したい場合は、以下のようにplainText引数に文字列を渡します。
# ===== QTextEdit テキストを入力した状態で表示 textedit = qtw.QTextEdit(self, plainText="テキスト")
【表示結果】
リッチテキストを表示 html
QTextEditで、リッチテキストを入力した状態で表示したい場合は、以下のようにhtml引数に文字列を渡します。
# ===== QTextEdit リッチテキストを表示 textedit = qtw.QTextEdit(self, html="<b>テキスト</b>")
【表示結果】
リッチテキストを許可しない acceptRichText=False
QTextEditでリッチテキストを許可しないようにするには、acceptRichText引数をFalseに設定します。この設定でリッチテキストをコピペしようとするとプレーンテキストに変換されてペーストされます。
# ===== QTextEdit Rich Textを許可しない textedit = qtw.QTextEdit(self, acceptRichText=False)
【表示結果】
QPushButton:ボタン
基本的な使い方
ボタンを表示するための「QPushButton」について紹介します。QPushButtonは、基本的には以下のように使用します。
import sys from PyQt6 import QtCore as qtc from PyQt6 import QtGui as qtg from PyQt6 import QtWidgets as qtw class MainWindow(qtw.QWidget): """メインウィンドウ""" def __init__(self): super().__init__() self.setWindowTitle("QPushButton") self.resize(320, 240) # ===== QPushButton 一般的な使い方 push_button = qtw.QPushButton("ボタン名", self) # 画面表示 self.show() def main(): """メイン関数""" app = qtw.QApplication(sys.argv) mv = MainWindow() sys.exit(app.exec()) if __name__ == "__main__": main()
【表示結果】
QPushButtonは、機能の実行や取消など様々なトリガーとして使用することができます。
以降での使い方のバリエーションを紹介します。実行は上記プログラムをベースとして、定義部分を置き換えて使ってみてください。なお、以降で紹介する引数は一つ一つ紹介しますが、複数組み合わせで指定して使用可能です。
ショートカットキーの設定 shortcut
QPushButtonにショートカットを設定するには、以下のようにshortcut引数にqtg.QKeySequence(“Ctrl+P”)のように指定します。このようにしておくことで、マウスでクリックしなくてもCtrl+Pを押すとボタンがクリックできるようになります。もちろん文字列の部分を変えれば別のキーをショートカットにすることも可能です。
# ===== QPushButton ショートカットキーの設定 push_button = qtw.QPushButton("クリック", self, shortcut=qtg.QKeySequence("Ctrl+P"))
【表示結果】
ボタン押下した時に押下状態を保持 checkable=True
QPushButtonで、ボタンを押したときにボタンを押した状態のままにしたい場合には、checkable引数をTrueに設定します。
# ===== QPushButton ボタン押下した時に押下状態を保持 push_button = qtw.QPushButton("クリック", self, checkable=True)
【表示結果】
ボタン押下した時に押下状態を保持(チェック状態で表示) checkable=True, checked=True
QPushButtonで、チェック状態で表示して押下状態を保持したい場合には、以下のようにcheckable引数とchecked引数をTrueに設定します。
# ===== QPushButton ボタン押下した時に押下状態を保持(チェック状態で表示) push_button = qtw.QPushButton("クリック", self, checkable=True, checked=True)
【表示結果】
QCheckBox:チェックボックス
基本的な使い方
チェックボックスを表示するための「QCheckBox」について紹介します。QCheckBoxは、基本的には以下のように使用します。
import sys from PyQt6 import QtCore as qtc from PyQt6 import QtGui as qtg from PyQt6 import QtWidgets as qtw class MainWindow(qtw.QWidget): """メインウィンドウ""" def __init__(self): super().__init__() self.setWindowTitle("QCheckBox") self.resize(320, 240) # ===== QCheckBox 基本的な使い方 checkbox = qtw.QCheckBox("チェック", self) # 画面表示 self.show() def main(): """メイン関数""" app = qtw.QApplication(sys.argv) mv = MainWindow() sys.exit(app.exec()) if __name__ == "__main__": main()
【表示結果】
以降での使い方のバリエーションを紹介します。実行は上記プログラムをベースとして、定義部分を置き換えて使ってみてください。なお、以降で紹介する引数は一つ一つ紹介しますが、複数組み合わせで指定して使用可能です。
ショートカットキーの設定 shortcut
QCheckBoxにショートカットを設定するには、以下のようにshortcut引数にqtg.QKeySequence(“Ctrl+P”)のように指定します。このようにしておくことで、マウスでクリックしなくてもCtrl+Pを押すとチェックを入れたり外したりできるようになります。もちろん文字列の部分を変えれば別のキーをショートカットにすることも可能です。
# ===== QCheckBox ショートカットキーの設定 checkbox = qtw.QCheckBox("チェック", self, shortcut=qtg.QKeySequence("Ctrl+P"))
【表示結果】
チェック状態で表示 checked
QCheckBoxでチェック状態で表示したい場合は、以下のようにchecked引数をTrueに設定します。
# ===== QCheckBox チェック状態で表示 checkbox = qtw.QCheckBox("チェック", self, checked=True)
【表示結果】
QRadioButton:ラジオボタン
基本的な使い方
ラジオボタンを表示するための「QRadioButton」について紹介します。QRadioButtonは、基本的には以下のように使用します。
import sys from PyQt6 import QtCore as qtc from PyQt6 import QtGui as qtg from PyQt6 import QtWidgets as qtw class MainWindow(qtw.QWidget): """メインウィンドウ""" def __init__(self): super().__init__() self.setWindowTitle("QRadioButton") self.resize(320, 240) # ===== QRadioButton 基本的な使い方 radio_button = qtw.QRadioButton("チェック", self) # 画面表示 self.show() def main(): """メイン関数""" app = qtw.QApplication(sys.argv) mv = MainWindow() sys.exit(app.exec()) if __name__ == "__main__": main()
【表示結果】
以降での使い方のバリエーションを紹介します。実行は上記プログラムをベースとして、定義部分を置き換えて使ってみてください。なお、以降で紹介する引数は一つ一つ紹介しますが、複数組み合わせで指定して使用可能です。
ショートカットキーの設定 shortcut
QRadioButtonにショートカットを設定するには、以下のようにshortcut引数にqtg.QKeySequence(“Ctrl+P”)のように指定します。このようにしておくことで、マウスでクリックしなくてもCtrl+Pを押すとチェックを入れたり外したりできるようになります。もちろん文字列の部分を変えれば別のキーをショートカットにすることも可能です。
# ===== QRadioButton ショートカットキーの設定 radio_button = qtw.QRadioButton("チェック", self, shortcut=qtg.QKeySequence("Ctrl+P"))
【表示結果】
チェック状態で表示 checked
QRadioButtonでチェック状態で表示したい場合は、以下のようにchecked引数をTrueに設定します。
# ===== QRadioButton チェック状態で表示 radio_button = qtw.QRadioButton("チェック", self, checked=True)
【表示結果】
QComboBox:コンボボックス
基本的な使い方
コンボボックスを表示するための「QComboBox」について紹介します。QComboBoxは、基本的には以下のように使用します。
import sys from PyQt6 import QtCore as qtc from PyQt6 import QtGui as qtg from PyQt6 import QtWidgets as qtw class MainWindow(qtw.QWidget): """メインウィンドウ""" def __init__(self): super().__init__() self.setWindowTitle("QComboBox") self.resize(320, 240) # ===== QComboBox 基本的な使い方 combobox = qtw.QComboBox(self) combobox.addItem("item 1", 1) combobox.addItem("item 2", "text") combobox.addItem("item 3", qtw.QWidget) combobox.insertItem(1, "item 1.5", 2) # 画面表示 self.show() def main(): """メイン関数""" app = qtw.QApplication(sys.argv) mv = MainWindow() sys.exit(app.exec()) if __name__ == "__main__": main()
【表示結果】
コンボボックスに表示する項目はaddItemメソッドで追加ができます。また、位置を指定して項目を挿入したい場合はinsertItemメソッドを使用します。
なお、各メソッドでは項目名と値を設定しています。値を設定しておくことで、選択された項目に合わせた値を取得してプログラムで使用することができます。以下のようにWidgetを設定したりできる点も面白い点です。
combobox.addItem("item 3", qtw.QWidget)
QSpinBox:スピンボックス
基本的な使い方
スピンボックスを表示するための「QSpinBox」について紹介します。QSpinBoxは、基本的には以下のように使用します。
import sys from PyQt6 import QtCore as qtc from PyQt6 import QtGui as qtg from PyQt6 import QtWidgets as qtw class MainWindow(qtw.QWidget): """メインウィンドウ""" def __init__(self): super().__init__() self.setWindowTitle("QSpinBox") self.resize(320, 240) # ===== QSpinBox 基本的な使い方 spinbox = qtw.QSpinBox(self, value=50, minimum=0, maximum=100) # 画面表示 self.show() def main(): """メイン関数""" app = qtw.QApplication(sys.argv) mv = MainWindow() sys.exit(app.exec()) if __name__ == "__main__": main()
【表示結果】
QSpinBoxは、上記のように値を上下のボタンで増やしたり減らしたりできます。また、直接編集して値を入力することも可能です。また、minumum引数とmaximum引数で値の範囲を制限することができます。
以降での使い方のバリエーションを紹介します。実行は上記プログラムをベースとして、定義部分を置き換えて使ってみてください。なお、以降で紹介する引数は一つ一つ紹介しますが、複数組み合わせで指定して使用可能です。
ステップ数を設定 singleStep
QSpinBoxで、値のステップ数を設定したい場合は、以下のようにsingleStep引数にステップ数を設定します。以下の例では、上下のボタンを押すごとに5ずつ値が変化します。
# ===== QSpinBox ステップ数を設定 spinbox = qtw.QSpinBox(self, value=50, minimum=0, maximum=100, singleStep=5)
【表示結果】
プレフィックスとサフィックスの表示 prefix, suffix
QSpinBoxで、値の前につくプレフィックスと後につくサフィックスを表示したい場合には、以下のようにprefix引数やsuffix引数に文字列を指定します。
# ===== QSpinBox プレフィックスとサフィックスを表示 spinbox = qtw.QSpinBox( self, value=50, minimum=0, maximum=100, prefix="¥", suffix="+ 税" )
【表示結果】
QDateTimeEdit:日付エディット
基本的な使い方
日付エディット欄を表示するための「QDateTimeEdit」について紹介します。QDateTimeEditは、基本的には以下のように使用します。
import sys from PyQt6 import QtCore as qtc from PyQt6 import QtGui as qtg from PyQt6 import QtWidgets as qtw class MainWindow(qtw.QWidget): """メインウィンドウ""" def __init__(self): super().__init__() self.setWindowTitle("QDateTimeEdit") self.resize(320, 240) # ===== QDateTimeEdit 基本的な使い方 datetimebox = qtw.QDateTimeEdit( self, date=qtc.QDate.currentDate(), time=qtc.QTime(0, 0) ) # 画面表示 self.show() def main(): """メイン関数""" app = qtw.QApplication(sys.argv) mv = MainWindow() sys.exit(app.exec()) if __name__ == "__main__": main()
【表示結果】
上記のように日付エディット欄が表示され、時間情報を入力することができます。初期表示の値はdate引数やtime引数に、qtc.QDateやqtc.QTimeを使って時間を日付や時刻を設定することができます。また、qtc.QDate.currentDate()やqtc.QTime.currentTime()を使うことで現在日付や時刻を取得することも可能です。
以降での使い方のバリエーションを紹介します。実行は上記プログラムをベースとして、定義部分を置き換えて使ってみてください。なお、以降で紹介する引数は一つ一つ紹介しますが、複数組み合わせで指定して使用可能です。
日時フォーマットの指定 displayFormat
QDateTimeEditで、日付フォーマットを指定したい場合は、以下のようにdisplayFormat引数にフォーマットを表す文字列を指定します。
# ===== QDateTimeEdit 日時フォーマットの指定 datetimebox = qtw.QDateTimeEdit( self, date=qtc.QDate.currentDate(), time=qtc.QTime(0, 0), displayFormat="yyyy-MM-dd HH:mm:ss", )
【表示結果】
なお、日付・時刻のフォーマットとしては以下のようなものが使用できます。
フォーマット文字 | 内容 |
---|---|
d | 日 |
M | 月 |
yy | 年(2桁) |
yyyy | 年(4桁) |
H | 時間 |
m | 分 |
s | 秒 |
カレンダーのポップアップを設定 calendarPopup=True
QDateTimeEditで、カレンダーで入力するためのポップアップを表示できるようにするには、calendarPopup引数をTrueに設定します。以下のように、カレンダーを表示して利用者に入力してもらうことが可能になります。
# ===== QDateTimeEdit カレンダーのポップアップを設定 datetimebox = qtw.QDateTimeEdit( self, date=qtc.QDate.currentDate(), time=qtc.QTime(0, 0), calendarPopup=True )
【表示結果】
期間の最大・最小を設定 minimumDate, maximumDate
QDateTimeEditで、指定できる期間の最大、最少を設定するには、minimumDate引数やmaximumDate引数に日付情報を設定します。
# ===== QDateTimeEdit 期間の最大・最小を設定 datetimebox = qtw.QDateTimeEdit( self, date=qtc.QDate.currentDate(), time=qtc.QTime(0, 0), calendarPopup=True, minimumDate=qtc.QDate(2000, 1, 1), maximumDate=qtc.QDate(2030, 12, 31), )
【表示結果】
まとめ
PythonのGUIツールキットであるPyQtでの画面開発で使用できるQtWidgetsについて整理して紹介しました。Qtで提供されているすべてを網羅できているわけではありませんが、中心的なWidgetについて多く紹介しました。
PyQtを使った画面開発際の参考としていただければよいかなと思います。
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。