Visual Studio 2015でQt GUIプログラムを組んでみる(2)
前回の続き
このページの続き。
このGUIは、QPushButtonとQLineEditを使っている。
実際にはQHBoxLayoutも利用しているが、まあ無くても問題はない。
シグナルとスロット
せっかくボタンを付けたのだから、なにか応答がないと面白くない。
Qtでは、シグナル/スロットという独自の機構を用いてアクションを処理する。
アクションが検出されると、シグナルが送信され、スロットが呼び出される。
当面はスロットだけ設計ができれば問題ないだろう。
シグナルとスロットを実装してみる
ここでは、以下の簡単な応答を実装する。
『ボタンをクリックすると、ダイアログのタイトルを、エディタに入力された文字列に更新する』
シグナル/スロットは、QtDesigner上で設計することができる。
ドックから上の項目を選択するか、F4キーを押せば、編集モードに移行できる。
次のようにして、ウィジェットどうしを接続する。
- 配置したPushButtonをクリック
- クリックした指を離さないまま
- 配置したダイアログ上でドロップ
そうすると、以下のようなウィンドウがポップアップするはずだ。
この画面で、PushButtonとDialogを『接続』する―
実際に、CUIでコーディングする際は、『connect』というキーワードを用いる。
左側のリストがシグナルのリスト、右側はスロットのそれだ。
単純にクリック応答にしたいので、左側からは『clicked()』を選択する。
スロットはさきほど考えた、『ダイアログのタイトルを、エディタに入力された文字列に更新する』だけの要求を満たさなければならない。
しかし、そんなに都合のよいスロットは、デフォルトで存在しない。
作るのだ。
スロットを作る
次のようにして、先のシグナルとオリジナルのスロットを接続する。
- スロットリスト最下方の『編集』ボタンをクリック
- スロットの一覧が表示されるので、直下の『+』ボタンをクリック
- 『setTitleByInput()』と入力
- 『OK』をクリックし、ポップアップダイアログを閉じる
- スロットリストに追加された『setTitleByInput()』を選択
- 『OK』をクリックし、ダイアログを閉じる
以下のように、接続が青色になるはずだ。
(追記2017/03/21:接続が青色になるのはスロットが実装されているとき)
スロットをコーディングする
残念ながら、ここで終わりではない。
ここまで、『clicked()』と『setTitleByInput()』を接続した。
しかし、肝心の処理内容はなにも書いていない。
まず、QtGuiSample.hppを、以下のように書き換える。
setTitleByInput()というメンバ関数をプロトタイプ宣言しただけだ。
しかし、スロットを明示するために、『private slots:』のラベルが必須となる。
次に、QtGuiSample.cppを、以下のように書き換える。
setTitleByInput()を実装する内容だ。
JavaでGUI設計をしたことのある人なら、難なく理解できるだろう。
なお、『text()』は、オブジェクトlineEditのメンバ変数のgetterだ。
Qtは、『getXX()』という命名を慣習的にしない。
試してみる
以上で完成だ。プログラムを実行してみる。
入力フォームに適当な文字列を入力して、ボタンをクリックする。
要求通りの動作が確認できた。