PyQt5で作成したGUIウィンドウで、メインタブのイベントをトリガーとして、複数タブの情報を制御する方法を紹介します。
開発環境は以下の通りです。
- OS: Windows 10 64ビット
- 開発言語: Python 3(バージョン:3.7.4)
- パッケージ: PyQt5(バージョン:5.14.1)
1. アプリケーション概要
具体的な制御方法の前に、実際に作成したアプリケーションの概要を紹介します。
アプリケーションのソースコードはGitHubで公開しています。
入力ファイルの構成と処理概要は以下の通りです。単体テストコードを自動生成するアプリケーションを開発する過程で作成したもののため、関数名や引数名、データ型名などを情報として持っています。
(入力)
ファイル名(コマンドライン引数を指定することで変更可能) | 記載内容 |
func_info.csv | 関数名と、その関数で使用される引数、グローバル変数名が記載されている |
args_info.csv | 引数名とデータ型が記載されている |
gl_vars_info.csv | グローバル変数名とデータ型が記載されている |
(処理概要)
- 3種類のcsvファイルを読み込み、メインタブに関数名のリスト、サブタブに引数とグローバル変数の情報をテーブル形式で描画する
- メインタブで関数名をダブルクリックすると、選択した関数名に応じて、サブタブの情報が更新(関数と関連する情報が抜粋)される
- サブタブの情報はユーザーが任意に変更可能としている
- サブタブで”OutputCsv”ボタンを押下すると、テーブルの情報がcsv形式で出力される
- メインタブで”Quit”ボタンを押下すると、処理を終了する
(GUIイメージ)
2. 複数タブの情報を制御する方法
2-1. タブの追加方法
タブの追加する方法に該当するソースコードは、pyqt5_tabs_test.pyのウィジェットの定義(# define tabs widgets)からタブ追加(# add tabs)になります。
(手順)
- QTabWidgetクラスのインスタンス生成
- タブに追加するTabクラス(QWidgetを継承したクラス)のインスタンス生成
- QTabWidgetクラスのaddTabメソッドを使用して、②のインスタンスをタブに追加(第二引数はウィンドウに描画されるタブの名前)
2-2. 複数タブの情報を制御する方法
PyQt5では、オブジェクト間の通信に「シグナル」と「スロット」を使用します。(「シグナル」と「スロット」の詳細についてはリファレンスガイドをご覧ください。)
本記事で紹介したアプリケーションにおける「シグナル」のトリガーと、「シグナル」の「スロット」として登録したメソッドは以下の通りです。
タブ名 | 「シグナル」のトリガー | 「スロット」として登録されたメソッド | 処理内容 |
main_tab | リスト内アイテムがダブルクリックされる
(QListWidget.itemDoubleClicked) |
MainTab.list_click
|
クラス内のフィールド(関数名)に反映
「シグナル」MainTab.procStartの生成 |
main_tab | MainTab.list_click関数内で「シグナル」が生成される
(MainTab.procStart.emit) |
Sub1Tab.update_table
Sub2Tab.update_table
|
クラス内のフィールド(データフレーム形式のテーブル情報)に反映
サブタブのテーブル情報を更新 |
main_tab | ”Quit”ボタンを押下
(QPushButton.clicked) |
QCoreApplication.instance().quit
|
処理を終了する |
sub1_tab
sab2_tab |
テーブル情報を更新
(QTableWidget.cellChanged) |
cell_change
|
クラス内のフィールド(データフレーム形式のテーブル情報)に反映 |
sub1_tab
sab2_tab |
”OutputCsv”ボタンを押下
(QPushButton.clicked) |
output_csv
|
テーブル情報をcsv形式で出力 |
sub1_tab
sab2_tab |
テキストボックスに文字入力
(QLineEdit.textChanged) |
set_csv_file_name
|
クラス内のフィールド(csvファイル名)に反映 |
1, 2行目に記載したprocStartをメインタブクラス内で定義して、サブタブクラス内のメソッドを「スロット」として登録することで、表題の機能を実現することが可能です。
「スロット」を登録するソースコードは、pyqt5_tabs_test.pyのスロットの登録(# define original signal to slot)が該当します。メインタブとサブタブは別々のクラスで実装しているため、「スロット」として登録する際には、メソッドの参照を渡します。