今日で夏休みは終わり。
そんな中、今日は部活に出かけていた。まぁ部室に買ったものを置きに来ただけですが。
今日はそれだけだったのですが、どうも聞けば夏休み前なので宿題で忙しくて活動する人がいないらしい。
まぁ確かに宿題が残ってたらつらいわ。
今年は僕は余裕があったので早く終わったけど、夏休み後半は宿題で大変ですわ。
C++でGUIといえばQtらしい。
というのをKDE好きの友人から聞いた気がする。
もっとも彼が言いたかったのは、XといえばKDE、KDEといえばQt、QtといえばC++みたいなことだったが。
まぁしかしC++のライブラリとしてはQtは非常に有名なので。
というわけでQt SDKをダウンロード。
Qt – Download
ここでLGPL/FreeのQt SDKをダウンロードしてインストール。
ここで気付いたんだが、QtってNokiaが作ってたのか。知らんかった。
できたらQt Creatorを起動する。そしてQt4 GUIライブラリを選択。
ここでmainwindow.uiファイルを選ぶと、グラフィカルな編集画面が出てくる。
これでフォームのデザインをする。
Horizonal SliderとLabelとLCD Numberを配置する。
それぞれ名前はslider,label1,lcdとしておきましょうか。これはプロパティのobjectNameで決められる。
あとLCDはsegmentStyleをflatとかにしておいた方が見やすいね。
とりあえずこれでビルドして実行してみると画面が表示される。
まずQtの第一歩としてはこれでOKです。もちろんこれでは何にも出来ませんが。
さて、ここからがQtの世界なのだが、どうもQtのオブジェクトは全部QObjectを継承しているらしい。
そのQObjectにはシグナルとスロットという機能がある。
VBやらC#の言葉を使えば、シグナルはイベントだ、そしてスロットはイベントに登録するメソッドといったところ。
Qtではシグナルとスロットをつなげて使う。これが特徴。
VBやC#ではメソッドを用意してイベントに登録する。まぁ大して変わらんわな。
しかしQt CreatorというIDEはおもしろい。
この編集画面の上の方にアイコンがたくさんならんでいます。
左からウイジェットの編集・シグナル/スロットの編集……という風なアイコンがならんでいる。
この左から2つ目を選んでみる。そしたら配置してあるウイジェットの上にカーソルを乗せると赤くなる。
これは何をする画面なのかというと、シグナルとスロットをつなぐ画面。
というわけで実践だ。
sliderからドラッグし始めてlcdで放す。するとシグナル/スロット接続を設定という画面が出てくる。
ここでシグナルはvalueChanged(int)を選ぶ。
そしたらこれと同じ引数、または引数を減らしたスロットにつなぐことになる。
ちょうどいいことにdisplay(int)というスロットがあるのでここに接続する。
これでOKする。これで接続完了。実行してみる。
するとスライダーの値を変えていったらいちいち反映される。こりゃすばらしい。
もっともこんな風に毎度毎度ちょうどいいスロットがあるわけでもないですけどね。
今回はlabel1の値を”Value is 10.”のように変えたいとする。さすがにlabelにそんな機能はない。
さて、どうするか。こういうときはドラッグ先を何もないところにする。
すると電気用図記号のグランドマークが出てくる。これは地面、すなわちMainWindowにつなぐということ。
シグナルはvalueChanged(int)を選ぶが、つなぐさきがない。そこで編集をクリック。
そしてSlots側で+を選んでスロットを追加する。ここではgetSlider(int)というスロットを追加した。
そしたらこれを選んでOK。これで接続できた。
あとは接続先を具体的に書けばOK。ここで初めてコードを書くことになる。
まずmainwindow.hを選んでclass MainWindowの定義に書き足す。
class MainWindow : public QMainWindow{
//以下を書き足す
private slots:
void getSlider(int value);
};
private slots:以下を書き足すことになります。
あれ? private:は知ってるが、private slots:ってなんだ?
実はこれはQtの拡張です。実はQtはこれをmocってやつでなんかコンパイルできるコードに変換しているらしい。
まぁこういうのを見ると本当にQtってQtの世界を作ってるよなぁと思わされる。
とりあえずこれで宣言は出来たので、内容をmainwindow.cppに書く。
void MainWindow::getSlider(int value){
this->ui->label1->setText(QString("Value is %1").arg(value));
}
uiの下に今回登録したウイジェットのオブジェクトのポインタが入っている。
ここからlabel1を探して、これのsetTextメソッドを呼び出せばいい。
ここでテキストを設定するわけだが、実はこのテキストがstd::stringとかじゃないというのが厄介。
Qtはなんか自分でいろんなライブラリを用意しているらしい。
Qt 4.5 リファレンス
ここで主要なクラスを見ると、ずいぶんたくさんある。なんとstd::vector相当のものとしてQListとかいうのもある。
この中でQStringというのを探す。いろいろな機能がある。
std::stringよりも多機能なのは間違えなさそうでargメソッドを使えばさっきやりたかったことも簡単にできる。
これでOK。これでビルドして実行すると、ラベルも変わっていきますね。
まぁなんというかQt自体がいろいろなものを持っているのでなかなかおもしろい。
例えばネットワーク系のライブラリもQtにありますね。これは便利そう。
もちろんSTLやBoostと組み合わせて使うのは全く問題ない。
が、なんとなくいらない気がする。QSharedPointerがboost::shared_ptrの代わりになりそうだし。
なんかQtで作るプログラムはQtに染まってしまいそうだ。
まぁしかしいろんな考え方があるでしょう。Qtなしで作った部分とQt部分を組み合わせてつかうだとか。
その辺はC++なので柔軟にできるんじゃないかなと思います。まだ調べてないけど。