需要のないページ

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

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

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

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

能書き

前にVS上でQtが動かないという記事を書いたが、結論から言うと動いた。

適当なこと言ってすみません。

 

環境

  • Windows10
  • Visual Studio 2015 Community
  • Qt Designer 5.6.0
  • Add-in 2.0.0 for Qt5

アドインなどが正しくインストールされている前提。

 

プロジェクトを作ってみる

ウィザードを活用してプロジェクトの骨組みを作る。

f:id:LouiS:20170306153513p:plain

『QtGUIApplication』を選択。

プロジェクト名とパスをちょいちょい決めて、次の画面へ。

 

f:id:LouiS:20170306154258p:plain

全ての項目が自動的に埋められる。

基底のクラス(Base Class)を、QDialogに変更しておく。

ヘッダファイルの拡張子がhからhppに変更されているのはただの好みだ。

 

f:id:LouiS:20170306154847p:plain

モジュールの選択を求められるが、とりあえずはデフォルトでよいだろう。

 

ケルトンコードがむにゃむにゃと生成される。

内容を人手で変更してよいのは、基本的に次の五つ。

  • Form Files
    • QtGuiSample.ui
  • Header Files
    • QtGuiSample.hpp
  • Resource Files
    • QtGuiSample.qrc
  • Source Files
    • main.cpp
    • QtGuiSample.cpp

Generated Filesフィルタに含まれるファイルは絶対にいじってはいけない。

また、ここではqrcファイルの編集はしないこととする。

 

GUIを作ってみる

ケルトンコードを実行すると、次のようなダイアログが表示される。

f:id:LouiS:20170306160656p:plain

ダイアログベースなので非常にシンプルだ。

 

このままではつまらないので、簡単なウィジェットを作ってみたいと思う。

Qt Designerがインストールされていれば、コードなしにGUIを設計できる。

  1. QtGUISample.uiを開く。Qt Designerが起動するはずだ。
  2. 左側のリストからパーツをドラッグ&ドロップして、下記のGUIを完成させる。
    いろいろ試してみてほしい。

f:id:LouiS:20170306161515j:plain

 

長くなったので、残りは別のページに貼る。

louis-needless.hatenablog.com

Visual Studio2015を敢えて英語化してみる

環境

 

能書き

近日Visual Studio 2017がリリースされるというのに、時期外れの投稿。

VSを日本語化する情報は多く見られるが、意外と英語化の記事は見当たらない。

 

なぜ英語化するかと言うと、かっこいいから情報が豊富なため。

それに、一度環境を作ってしまえば、簡単に日英の言語を切り替えられる。

 

インストールまでの手順

まずLanguage packをインストールする。

Download Microsoft Visual Studio 2015 Language Pack from Official Microsoft Download Center

なぜか日本語サイトからダウンロードしたLanguage packはうまく動作しない。

英語サイトからダウンロードしよう。

 

ダウンロードしたexeファイルを開き、インストール開始。

しばらく時間がかかるので、散歩でもしていよう。

 

インストール後の手順

  1. Visual Studioを開く。
  2. メニューバーから「ツール」→「オプション」を選択。
  3. 画面左のリストから「環境」→「国際対応の設定」を選択。
  4. 「言語」を「English」に設定。
  5. Visual Studioを起動しなおす。

f:id:LouiS:20170225144557j:plain

コンピュータのリブートは必要ない。

 

エラーが出るとき

トラブルでインストールが中断された場合、VSを起動できないことがある。

Microsoft Visual Studio で、インストールされている言語リソースのバージョンの不一致が検出されました。

このようなときは、exeファイルを再度開き、リペアしてしまえばよい。

 

QLabelに画像を貼り付ける

クラスを選ぶ

Qtにおいて、画像を表示できるウィジェットは、(たぶん)主に三種類ある。

単純に画像を表示するだけなら、QLabelが簡単そうだ。

 

画像行列自体を扱うクラスも、四種類ほどある。

リファレンスによると、画像の入出力および加工にはQImageが、

画像の表示にはQPixmapが適しているらしい。

 

使ってみる

  • fullpath... 画像ファイルのフルパスのアドレス (QString*)
  • mLabel... 貼り付ける先のラベルのアドレス (QLabel*)

が既に得られているとき、次のように画像を貼り付けられる。

せっかくなのでラベルのサイズに画像を合わせてみた。

なお、メンバ関数scaleの第2引数で引き伸ばし方を設定できる。

詳しくはQPixmap::scaledまで。

 

例外処理してないのはご愛嬌。

PickerModalLoopの前に屈服した話

QFileDialogクラスの静的メソッドに、getOpenFileNameというものがある。

これはたぶんWin32APIの同名関数のラッパであるが、

Qt Creator上で使用すると次のようなランタイムエラーがでる。

shell\comdlg32\fileopensave.cpp(14274)\comdlg32.dll!00007FFA27B4EFF2: (caller: 00007FFA27B7FDA1) ReturnHr(3) tid(2930) 80004005 エラーを特定できません

    CallContext:[\PickerModalLoop]

アプリケーションが落ちることはないのだけれど、

致命的なエラーです。

と言って脅されるので、Google大先生で解決策を探すことにした。

 

結論から言うと、これはWindows10のバグで、あきらめた方がよいらしい。

[QTBUG-52618] comdlg32.dll, thumbcache.dll warnings when using QFileDialog - Qt Bug Tracker

  • Windows7まで問題なく動いたソースもエラーが出る
  • 何もできることはない
  • Qtのバグではなく、Windows10のバグである
  • 諸悪の根源はcomdlg32.dll

 

Microsoftの修正が待たれるわけだけれど...

Windows 10 comdlg32.dll problems

二年以上前の質問が完全に無視されている。

期待しない方がいいらしい。

Qtのビルドディレクトリが鬱陶しい話

能書き

デフォルト設定のままビルドすると、

ビルドディレクトリはプロジェクトのディレクトリと同一階層に生成される。

 

こんな感じ。

f:id:LouiS:20170211181549j:plain

これは気持ち悪い。

 

しかも、DebugとReleaseとでディレクトリが分かれているにも関わらず、

ファイル内部はこんな感じだ。

f:id:LouiS:20170211182006j:plain

ものすごく気持ち悪い。

当然、関係ないほうのディレクトリは空だ。

 

解決策

ツール→オプション→ビルドと実行 は、次のようになっている。

f:id:LouiS:20170211182950j:plain

デフォルトビルドディレクトリを、

ごちゃごちゃ文字列 → ./build に変更(.の個数に注意)。

そして、Qt Creatorを再起動。

 

これでだいぶきれいになる。 f:id:LouiS:20170211183529j:plain

 

もし既に作ってしまったプロジェクトについて、同じようなことをしたいなら、

プロジェクト(画面左)→ビルドディレクトリ を書き換えればよい。

 

 

 

Qtのプログラムをデバッグできない

Qt Creatorを使ってみたはいいけれど、実行はできてもデバッグできない。

『Unknown debugger type "No engine"』

いや、普通にデバッガが登録されてないって言ってよ...

 

デバッガを入手したはよいが、それでもエラーは改善されない。

 

ちょっとオプションを覗いてみたら、すぐ解決した。

f:id:LouiS:20170204162443j:plain

デバッガをドロップダウンリストから選ばなければならないらしい。

キットに合わせてx64を選んで、解決。

Visual Studio 2015とWindows 10 SDKを両立させる

いろいろなソフトをいじってると、Windows SDKを要求される場面が多々ある。

Visual StudioにはWindows SDKが同梱されているけれど、

VS2015のSDKは、外部から参照できない形で組み込まれているようだ。

 

仕方ないのでSDK単体をインストールしようとすると、エラーがでる。

You must uninstall the Windows Software Development Kit- Windows 10.0.10586.15 before you can install the latest version of the kit.

 

それで困っていたら、こんなフォーラムを見つけた。

stackoverflow.com

この記事にしたがって、デバッガを無事インストールできた。

 

なお、開くのはコントロールパネルでなくて、この画面。

f:id:LouiS:20170204123641j:plain

qt_metacallのリンクエラーを解消した(い)

追記:2017/03/21

内容に誤りが多かったため、大幅に修正しました。

 

発生した問題

Visual studioにQtをアドインで入れてみた。

 

QtのQObjectクラスを継承したクラスを作るときは、

Q_OBJECTマクロをヘッダに記載しなければならない。

 

でも、いざコンパイルしてみると...

error LNK2001: 外部シンボル ""public: virtual int __cdecl MyObject::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@MyObject@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z)" は未解決です。 error LNK2001: 外部シンボル ""public: virtual void * __cdecl MyObject::qt_metacast(char const *)" (?qt_metacast@MyObject@@UEAAPEAXPEBD@Z)" は未解決です。 error LNK2001: 外部シンボル ""public: virtual struct QMetaObject const * __cdecl MyObject::metaObject(void)const " (?metaObject@MyObject@@UEBAPEBUQMetaObject@@XZ)" は未解決です。

 

いろいろ調べても、英語のページばっかりヒットする。

それっぽいlibファイルも見当たらない。

 

実はこれ、Qtの根幹技術であるMOCが働いていないせいである。

 

解決策1:ウィザードを使ってみる

louis-needless.hatenablog.com

 

解決策2:プロジェクトファイルなどを書き換える

louis-needless.hatenablog.com

 

反省

前回投稿した際は、単にQtの不具合として切り捨ててしまっていた。

あまりに知識が少なく、誤った情報を鵜呑みにしていたし...

メモ帳代わりの当ページ、私だけのために作ったページであるが、

多くの人の目に触れる以上、もっと正確な記事を書くべきであった。

 

戒めとして古い記事を残そうとも思ったが、

完全に間違った情報を野放しにするわけにもいけまい。

加筆どころか全体を修正して更新した。

/* コードブロック */