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のビルドディレクトリが鬱陶しい話
能書き
デフォルト設定のままビルドすると、
ビルドディレクトリはプロジェクトのディレクトリと同一階層に生成される。
こんな感じ。
これは気持ち悪い。
しかも、DebugとReleaseとでディレクトリが分かれているにも関わらず、
ファイル内部はこんな感じだ。
ものすごく気持ち悪い。
当然、関係ないほうのディレクトリは空だ。
解決策
ツール→オプション→ビルドと実行 は、次のようになっている。
デフォルトビルドディレクトリを、
ごちゃごちゃ文字列 → ./build に変更(.の個数に注意)。
そして、Qt Creatorを再起動。
これでだいぶきれいになる。
もし既に作ってしまったプロジェクトについて、同じようなことをしたいなら、
プロジェクト(画面左)→ビルドディレクトリ を書き換えればよい。
Qtのプログラムをデバッグできない
Qt Creatorを使ってみたはいいけれど、実行はできてもデバッグできない。
『Unknown debugger type "No engine"』
いや、普通にデバッガが登録されてないって言ってよ...
デバッガを入手したはよいが、それでもエラーは改善されない。
ちょっとオプションを覗いてみたら、すぐ解決した。
デバッガをドロップダウンリストから選ばなければならないらしい。
キットに合わせて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.
それで困っていたら、こんなフォーラムを見つけた。
この記事にしたがって、デバッガを無事インストールできた。
なお、開くのはコントロールパネルでなくて、この画面。
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:ウィザードを使ってみる
解決策2:プロジェクトファイルなどを書き換える
反省
前回投稿した際は、単にQtの不具合として切り捨ててしまっていた。
あまりに知識が少なく、誤った情報を鵜呑みにしていたし...
メモ帳代わりの当ページ、私だけのために作ったページであるが、
多くの人の目に触れる以上、もっと正確な記事を書くべきであった。
戒めとして古い記事を残そうとも思ったが、
完全に間違った情報を野放しにするわけにもいけまい。
加筆どころか全体を修正して更新した。