Qtに関する覚え書き[エラー・警告メッセージ]

実行時のエラー

ライブラリの不足

コンピューターにQt5Cored.dllがないため、プログラムを開始できません。
この問題を解決するには、プログラムを再インストールしてみてください。

■状況

Qt Creatorでビルド&実行をした時に、このメッセージが表示されました。
プロジェクトを初めて実行した時は、ウイルスチェックに引っ掛かることがあります。
2回目から出なくなれば問題ありません。

Pathを設定しないで、実行ファイル(exe)を直接実行した場合にもこれが出ます。
必要なライブラリを実行ファイルと同じ場所に置くか、Pathを設定すれば解決します。

■場所について (Qtインストール先が"C:\Qt\Qt5.3.2"の場合)

ライブラリ類 (Qt5Cored.dllなど)

C:\Qt\Qt5.3.2\5.3\mingw482_32\bin

コンソールコマンド類 (gdb.exeなど)

C:\Qt\Qt5.3.2\Tools\mingw482_32\bin


■Path設定手順 (Windows7の場合)

(1)[コンピューター]を右クリックして[プロパティ]を選択します。
(2)システム画面左側の[システムの詳細設定]をクリックします。
(3)プロパティ画面の[詳細設定]タブを開き、[環境変数]ボタンをクリックします。
(4)システム環境変数の[Path]を選択して[編集]ボタンをクリックします。
(5)変数値の最後に区切り記号(;)を付けてQtの場所を追加します。
例えば、Qtインストール先が"C:\Qt\Qt5.3.2"の場合

(既存の値) ;C:\Qt\Qt5.3.2\5.3\mingw482_32\bin

※新規作成の場合、区切り記号は必要ありません。

マルチメディアの問題(未解決)

DirectShowPlayerService::doRender: Unresolved error code 80040266

■状況

拡張子mp4のファイルをQMediaPlayerにセットして、ロードしようとした時に出ました。
コーデックがないから再生できないらしいです。
でも、WindowsのMediaPlayerでは再生できました。

スタイルシートの問題

Could not parse stylesheet of object 0x1ac36200

■状況

詳しいメモを紛失したので詳細は不明です。
スタイルシートの設定に構文エラーがあったようです。

リソースの問題

No rule to make target '../project/XXX', needed by 'debug/qrc_resource.cpp'. Stop.

■状況

リソースに登録したファイルの実体を削除した時に出ました。
リソースエディタで完全削除をしても、このエラーが出ました。
プロジェクトのリビルドやクリーンを実行しましたが、効果がありませんでした。

■原因

エラーが出るようになる前に結構な数のリソースを追加/削除していた影響かもしれません。
削除したファイルの名前がmake関連ファイルのどこかに残ってしまったのかもしれません。

■解決策

リソースファイル自体を一度プロジェクトから外して、戻したらエラーが出なくなりました。

(1) プロジェクトツリーのリソースファイル名(.qrc)を右クリックして[ファイルの削除]
(2) プロジェクト名を右クリックして[既存のファイルを追加]

※ファイルの削除で実体が消えることはありません。 リソースファイルがプロジェクトから取り除かれるだけです。

親の指定

■状況

メインウインドウのメニューバーのmouse_overイベントがうまく動作しなくなりました。
ウインドウの左上100x50ぐらいの部分に見えない何かがあるようでmouse_overが働きません。

■解決策

引数のparentを省略したら、この現象は出なくなりました。

実行時の警告

無効なパラメーター

selectNameFilter: Invalid parameter 'Directories' not found in 'All Files (*)'.

■状況

フォルダ選択ダイアログを表示した時に出ました。

■解決策

オプション(HideNameFilterDetails)を指定したら解決しました。これはバグかもしれません。

リサイズ時の警告1

setGeometry: Unable to set geometry 12x20+640+286 on QWidgetWindow/'QLabelClassWindow'.
Resulting geometry: 116x20+640+286 (frame: 4, 25, 4, 4, custom margin: 0, 0, 0, 0,
 minimum size: 0x0, maximum size: 16777215x16777215).

■状況

どこで出た警告なのか覚えていません。
ラベルの横幅を12pxにするのは無理だから116pxにしたということですね。

■解決策

該当するラベルを作成する時に最少幅を指定しました。

リサイズ時の警告2

setGeometry: Attempt to set a size (550x24) violating the constraints(423x24 - 423x24)
 on window QWidgetWindow/'QLabelClassWindow'.

■状況

ウインドウサイズが変わった時に、ラベルの横幅を再計算して設定し直していました。
ラベルを固定幅にしないと、長い文字列を入れた時に自動的に横に伸びてしまいます。
常に作成時の横幅(423px)がminumumWidth/maximumWidthとして認識されます。
minimumWidthやsizePolicyなどいろいろ試しましたが、どうしても制約違反になります。
他の所を修正していたら、いつの間にか出なくなってたりします。バグかもしれません。
警告なので無視してもいいのですが、最大サイズを指定したら出なくなりました。

■解決策

該当するラベルを作成する時に、最大幅としてデスクトップの横幅を指定しました。

コンパイルエラー

レイアウトのセット

QWidget::setLayout: Attempting to set QLayout "" on MainWindow "MainWindow", which already has a layout

■状況

メインウインドウに垂直ボックスレイアウトをセットしようとしたら出ました。

■解決策

垂直ボックスレイアウトをウィジェットに入れて、メインウインドウにセットしました。

関数の宣言

extra qualification ‘sample1::’ on member ‘sample1’ [-fpermissive]

■状況

ヘッダーのクラス宣言の中のメンバ関数の宣言がエラーになりました。
ソースの関数の行をそのままコピーしたのが敗因です。

■解決策

ヘッダーの宣言文からクラス名(sample1::)を取り除きました。

食い違い

void value not ignored as it ought to be

■状況

戻り値voidで宣言している関数の戻り値を使おうとした時に出ました。
関数のほうを変更した時にヘッダーの宣言文を直し忘れたものです。

■解決策

ヘッダーの宣言文を関数と一致させました。

インクルード宣言

'XXX’does not name a type
'XXX' has not been declared
invalid use of incomplete type 'class XXX'
'XXX' was not declared in this scope
variable 'XXX in' has initializer but incomplete type
incomplete type 'XXX' used in nested name specifier

■状況

XXXのヘッダーをインクルードしないで、メンバーを使おうとしたら出ました。

■解決策

XXXのヘッダーを追加すれば解決します。
下記をヘッダーに記述しておけば、ほとんどは個別にインクルードする必要がありません。

switch文の警告

warning: enumeration value 'XXX' not handled in switch [-Wswitch]

■状況

イベントタイプをswitch文で判定しようとした時に大量に出ました。

■解決策

switch文ではなく、if文でevent->type()を判定するように変更しました。
event->type()を変数に入れて、それをswitch文で判定しても大丈夫です。

リソースエラー

[debug/qrc_resource.cpp] Error 1
RCC: Error in '..\project\resource.qrc': Cannot find file 'XXX'

■状況

リソースに登録したファイルの実体を削除して、リソース登録の削除を忘れていた時に出ました。

■解決策

リソースエディタで消してしまったリソースを削除すれば解決します。
プロジェクトツリーで、該当ファイルを右クリックして削除することもできます。

2016年12月