刹那(せつな)の瞬き

Willkömmen! Ich heiße Setsuna. Haben Sie etwas Zeit für mich?

Qt5: 入門Qt4〜勝手にQt5 その1

今年に入ってから、2月初旬までの間、Qt5を触ってました。

Qt5にはチュートリアルが豊富にあるので、それなりに独習できる環境にあると思います。
しかし、流行はQtQuick系とかモバイル系とか。
諸事情により、今のところ僕の目的はデスクトップ・アプリなので方向性が異なります。

書籍を探したところ、Qt5デスクトップに関するものは見つけられずじまい。
もっとも、Qt5の公式サイトには情報がみっちり書いてあるので、まあいいのです。
ずっと以前に購入したO'Reillyの「入門Qt4プログラミング」があるし。
この本と公式サイトと見比べて学習すれば、割とサクサク進むでしょう。

と、思って始めたものの、最初の一歩に手間取りました。
Qt4 → Qt5にあたり、以前と僕の前提が随分違います。
OSはUbuntu → OSX10.9に変更、QtCreatorもバージョン間で操作に差異あるし。

なので、少しだけ手間取った箇所だけ備忘録。
プラットホーム: Mac(OSX10.9) Qt5.2.1 (dmgからインストール)、QtCreator: 3.0.1
しばらくは、この環境が前提です。

まず、1章のウィジェットのレイアウト節では、いきなりのコンパイル・エラー。
Qt5公式サイトに記事があったけど、#includeだし面倒なので簡単な方法で修正。

#include <QApplication>
#include <QtWidgets>

本当は使用するWidgetsだけインクルードするのが良いのでしょうが、とりあえずはこれで。

続いて、公式サイトの記述 に従い、SIGNALとSLOTを書き換えてみます。

QObject::connect(spinBox, &QSpinBox::valueChanged, slider, &QSlider::setValue);
QObject::connect(slider, &QSlider::valueChanged, spinBox, &QSpinBox::setValue);

のように記述してみたのですが、コンパイル・エラーになってダメです。
ネットを探したら、同様に悩んでる方がいました。
そして、そこの素敵な回答 を参考にしたら、期待通りに回避できました。

QObject::connect(spinBox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), slider, &QSlider::setValue);
QObject::connect(slider, &QSlider::valueChanged, spinBox, &QSpinBox::setValue);

そっか、QSpinBoxのvalueChangedはoverloadされてるから、前のはダメだったのか。
んー、文法的にマクロより安全だろうけど、可読性が落ちるのは嫌だなぁ。
って事で、僕はケース・バイ・ケースにします。

でも、「素敵な回答」にあったけど、テンプレートで解決するのもアリですね。