PyQt5で複数タブ間の情報を制御する方法

GUI communicate-between-multiple-tabs-on-pyqt5

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イメージ)

main-tab-image sub1-tab-imagesub2-tab-image

広告

2. 複数タブの情報を制御する方法

2-1. タブの追加方法

タブの追加する方法に該当するソースコードは、pyqt5_tabs_test.pyウィジェットの定義(# define tabs widgets)からタブ追加(# add tabs)になります。

(手順)

  1. QTabWidgetクラスのインスタンス生成
  2. タブに追加するTabクラス(QWidgetを継承したクラス)のインスタンス生成
  3. 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)が該当します。メインタブとサブタブは別々のクラスで実装しているため、「スロット」として登録する際には、メソッドの参照を渡します。

 

広告