需要のないページ

プログラミングや趣味や。

Visual Studio 2015でQt GUIプログラムを組んでみる(2)

前回の続き

louis-needless.hatenablog.com

このページの続き。

 

f:id:LouiS:20170306161515j:plain

このGUIは、QPushButtonQLineEditを使っている。

実際にはQHBoxLayoutも利用しているが、まあ無くても問題はない。

 

シグナルとスロット

せっかくボタンを付けたのだから、なにか応答がないと面白くない。

Qtでは、シグナル/スロットという独自の機構を用いてアクションを処理する。

 

アクションが検出されると、シグナルが送信され、スロットが呼び出される。

当面はスロットだけ設計ができれば問題ないだろう。

 

シグナルとスロットを実装してみる

ここでは、以下の簡単な応答を実装する。

『ボタンをクリックすると、ダイアログのタイトルを、エディタに入力された文字列に更新する』

 

シグナル/スロットは、QtDesigner上で設計することができる。

f:id:LouiS:20170314121539p:plain

ドックから上の項目を選択するか、F4キーを押せば、編集モードに移行できる。

 

次のようにして、ウィジェットどうしを接続する。

  1. 配置したPushButtonをクリック
  2. クリックした指を離さないまま
  3. 配置したダイアログ上でドロップ

そうすると、以下のようなウィンドウがポップアップするはずだ。

f:id:LouiS:20170314122210p:plain

この画面で、PushButtonとDialogを『接続』する―

実際に、CUIでコーディングする際は、『connect』というキーワードを用いる。

 

左側のリストがシグナルのリスト、右側はスロットのそれだ。

単純にクリック応答にしたいので、左側からは『clicked()』を選択する。

 

スロットはさきほど考えた、『ダイアログのタイトルを、エディタに入力された文字列に更新する』だけの要求を満たさなければならない。

しかし、そんなに都合のよいスロットは、デフォルトで存在しない。

作るのだ。

 

スロットを作る

次のようにして、先のシグナルとオリジナルのスロットを接続する。

  1. スロットリスト最下方の『編集』ボタンをクリック
  2. スロットの一覧が表示されるので、直下の『+』ボタンをクリック
  3. 『setTitleByInput()』と入力
  4. 『OK』をクリックし、ポップアップダイアログを閉じる
  5. スロットリストに追加された『setTitleByInput()』を選択
  6. 『OK』をクリックし、ダイアログを閉じる

以下のように、接続が青色になるはずだ。
(追記2017/03/21:接続が青色になるのはスロットが実装されているとき)

f:id:LouiS:20170314124344p:plain

 

スロットをコーディングする

残念ながら、ここで終わりではない。

ここまで、『clicked()』と『setTitleByInput()』を接続した。

しかし、肝心の処理内容はなにも書いていない。

 

まず、QtGuiSample.hppを、以下のように書き換える。

setTitleByInput()というメンバ関数をプロトタイプ宣言しただけだ。

しかし、スロットを明示するために、『private slots:』のラベルが必須となる。

 

次に、QtGuiSample.cppを、以下のように書き換える。

setTitleByInput()を実装する内容だ。

JavaGUI設計をしたことのある人なら、難なく理解できるだろう。

 

なお、『text()』は、オブジェクトlineEditのメンバ変数のgetterだ。

Qtは、『getXX()』という命名を慣習的にしない。

 

試してみる

以上で完成だ。プログラムを実行してみる。

f:id:LouiS:20170314132915p:plain

入力フォームに適当な文字列を入力して、ボタンをクリックする。

 

f:id:LouiS:20170314132914p:plain

要求通りの動作が確認できた。

/* コードブロック */