QtサンプルプログラムboxesをVS2017で動かしてみた

Qtのバージョンは5.10.0
QtのインストールディレクトリはC:\Dev\Qtにしているので、だいたいふつうはC:\Qtが多いかもしれませんので、その場合は読み替えてください。
QtCreatorでOpenGLを使わない他のサンプルでは動かせました。ただMinGW 32bitでした。
#サンプルboxesを動かすにあたっての方針
1, 無料版のVisual Studio 2017 Communityを使ってデバッグまでこのツールを使いたい
2, qmakeは最小限で手動でサンプルのソースやリソースをVS2017のプロジェクトに組み込む
　とは言ってもqmakeでmoc_xxxxを生成しないとターゲットができないのでこれは使いました。

サンプルプログラムの場所：
C:\Dev\Qt\Examples\Qt-5.10.0\widgets\graphicsview\boxes

#作業開始
##1 VS2017で空のプロジェクト、ソリューションを生成。
新規でboxesというソリューションを作成します。現在のOS環境が32bitなのでwin32スタイルのプロジェクトになればいいです。
![newproj.png](https://qiita-image-store.s3.amazonaws.com/0/200517/d3a2b4e0-c351-ead4-ede9-fa527f38be6b.png)

VSのプラグインを使用すれば、こんなことしなくてもできるらしいです。
この設定メモはqt特有の自動処理はなるべく省いてというスタンスで書いています。

普通にboxesの場所に作成すると階層的にサブフォルダboxesが２つもできてしまうので自分の場合はソリューションファイルはgraphicsview直下にして、プロジェクトファイルvcxprojファイルはboxes直下になるように配置しました。
![view_folder.png](https://qiita-image-store.s3.amazonaws.com/0/200517/4c72ae01-cecd-bd5f-419c-99eefa697f4c.png)
このへんも好きなやり方でかまわないはずですが実行時やデバッグ時のVS2017のカレントディレクトリはboxes直下だと認識しながら作業が必要です。

### mocファイルの生成
これは、結局qmakeを使ってコンパイルしなければならず。
これを行うと、とりあえずターゲットのexeまでできてしまうんですけどね、でもデバッグとかはVisual Studio 2017でできるわけではないのでこれも途中作業といえば途中作業。:sweat_smile:
それで、qmakeを最後までやるには、「開発者コマンド プロンプト For VS 2017」
をたちあげます。
そこで
＞\dev\qt\5.10.0\msvc2015\bin\qmake.exe -project
とqmakeをフルパスで指定してビルドをおこないました。
\ は ￥マークを入れてください。
Qtのコマンドプロンプト画面でもできるかもしれませんが、VS2017のclが自動的に動くようにセッティングするパス参照のセットが必要と思われます。

＞msvc-version.conf loaded but QMAKE_MSC_VER isn't set
これが出たらどうするか、検索しましたが有効な解決策はなし。
自分はこれで一発解決！、これしかなかった。何かもっと正しく、まっとうな方法がわかったら教えてくださいまし。

C:\Dev\Qt\5.10.0\msvc2015\mkspecs\common\msvc-version.conf
をエディタで開いて
＃のコメント行が終わる直後に以下を追加します。
(Windows 7 の環境変数に追加し再起動してもだめでありましたので）
QMAKE_MSC_VER = 1909

これでqmakeのコマンドはだいたい通るようになったはずです。

##2 空のプロジェクトにboxes以下のヘッダー、ソース、リソースファイルを追加していきます。
リソースファイル(拡張子がfsh,vsh,png,jpgなど）はVisual Studioの形式で組み込まれるわけではないのでプロジェクトには追加しなくても問題はありません。
ただ、使用しているというだけで、exeに組み込まれないので管理上ソリューションエクスプローラーに見えた方がいいかどうかくらいの違いなので組み込みたくない場合は入れないで大丈夫です。boxes.qrcは組み込んでください。
mocというフィルターを作成して、そこにmoc_scene.cppを手動でセットします。
このmoc_scene.cppはqmakeで一度コンパイルを成功させます。

![solutionex.png](https://qiita-image-store.s3.amazonaws.com/0/200517/2ad87f15-2b6e-b121-8ce7-296813630db6.png)

上記のようにしていますが、vshファイルはビルドを除外の設定をしておかないと、ビルドエラーになりますので、ファイルを選択しプロパティからビルドの除外を設定してください。
重要なのが、boxes.qrcのQt特有のリソース定義ファイルです。
##3 boxes.qrcの設定
このファイルを選択して、（マウス右ボタンで）プロパティよりカスタムビルドの設定を行います。
![qrc1.png](https://qiita-image-store.s3.amazonaws.com/0/200517/759fe45f-4f8a-b3df-0811-31f6bf5d2efc.png)

上記画像のように「カスタムビルドツール」になるように選択してください。
ビルドから除外はデフォルトのままで大丈夫ですが、いちおう「いいえ」にしています。

![qrc2.png](https://qiita-image-store.s3.amazonaws.com/0/200517/078db50f-0ab0-bdd0-a2a7-99bfa2484dc0.png)
ビルドツールはrcc.exeのパスをフルパスで指定してパラメータもマクロを利用してセットしてみました。

自分の場合はリソースファイルがboxes直下にちらばっているのがいやだったのでresのサブフォルダを作成してその中にまとめました。
そのため、ソースでファイルを指定しているところまですべて修正しました。(6,のリソースファイルのビルド実行設定と実行時の組み込み処理の追加で説明）
このあたりは、整合性をとればどこにどう配置しても構わないことですのでそのままでも大丈夫です。

##4 インクルードパスの追加
まずはプロジェクトのプロパティを開いてから、以下の画面の箇所です。
![inc1.png](https://qiita-image-store.s3.amazonaws.com/0/200517/e9366740-0210-70e9-e3e5-5708413821ac.png)
![inc2.png](https://qiita-image-store.s3.amazonaws.com/0/200517/545a6d29-fe78-c6a5-1540-764cca80e514.png)
手動で３つ追加しましたが、一つ上のincludeでも大丈夫なのか？わからないけど使っているインクルードがはっきりしたほうがいいかなと思い個別に指定する主義です:sweat_smile:
##5 ライブラリファイルの追加
同様にプロジェクトのプロパティを開いてから、以下の画面の箇所に追記していきます。
![addlib1.png](https://qiita-image-store.s3.amazonaws.com/0/200517/1165ad25-f137-0ab5-97ad-812f7561c2c4.png)
![addlib2.png](https://qiita-image-store.s3.amazonaws.com/0/200517/3cc47449-c52e-2a6c-9074-2abd67c6853d.png)

##6 リソースファイルのビルドが成功するかどうかの確認
セクション３でboxes.qrcファイルのビルドの実行がおこなわれるようにファイルのプロパティで設定しました。これが成功するかどうかを確認します。
まずは、エラーの場合の画面から
![builderr1.png](https://qiita-image-store.s3.amazonaws.com/0/200517/abb08bb7-36ab-3be4-00fb-4de8824b5064.png)
リソースファイルはboxes直下にresというサブフォルダを作成してMFCアプリケーションみたいにそこにまとめようとしたためファイル名にres/を付け加える必要がありましたが、そのままに上記画面の４行目をしてみました。
「MSB6006	"cmd.exe" はコード 1 を伴って終了しました。	」
などとエラーになっています。
このエラーは最初cmd.exeなどと出るので何のエラーかとまどいましたがリソースコンパイラがエラーを返したということでしょう。
「出力」タブに切り替えてチェックすれば何がエラーかははっきりします。
![builderr2.png](https://qiita-image-store.s3.amazonaws.com/0/200517/f4b16603-56cc-0194-a27a-a75df9ae236f.png)
ディレクトリ構成に合わせてこのビルドが通るようにします。
-----------------------------------
1>------ ビルド開始: プロジェクト: boxes, 構成: Debug Win32 ------
1>Performing Custom Build Tools
1>boxes.vcxproj -> C:\Dev\Qt\Examples\Qt-5.10.0\widgets\graphicsview\Debug\boxes.exe
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========
ビルドが成功することを確認します。
##7 実行時のリソース組み込み処理の追加
	QResource::registerResource("boxes.rcc");
の１行をmain()関数のどこかに追加します。
自分の場合、下の場所に追加しました。
![main_add.png](https://qiita-image-store.s3.amazonaws.com/0/200517/bec6e553-5c4b-a44c-c429-5a10d3cd8160.png)

##8 実行時必要なQtのDLLのコピー
サンプルプログラムboxesの直下に以下のファイルをコピーして実行させました。
これがたくさんのサンプルの場合はパスを切って動くようにする必要がありそうですが、今まではマシンの環境はあまり変えたくない場合が多かったのでその都度開発プロジェクトへコピーして、、という感じでした。
Qt5Cored.dll
Qt5Widgetsd.dll
Qt5guid.dll
Qt5OpenGLd.dll
デバッグ時Qtの内部も追う可能性があればpdbファイルもコピーします。自分の場合はpdbもコピーしました。


##9 実行
![boxes_desktop.png](https://qiita-image-store.s3.amazonaws.com/0/200517/7372af4e-e369-09bf-ea23-1134514e1b89.png)
ただ、このサンプルはマウスで操作しようとすると画像が消えたりするので小さなダイアログボックスのコンボボックスをキーボードで操作すると変化します。

以上になります。