質問: C++でやっています。 Qtを使ってみたいと思い、挑戦中です。 なにやら面倒くさいので Qtを簡略化するDLLを作成しようとしています。 ですが、Qtそのものを使い切れないとライブラリ化できないので挑戦しています。 // 字数制限のため、リンクにします。 ソースコード という風にやってみましたが、コンパイルは無事通るのですが なぜか起動できません。 ダブルクリックをしてもウィンドウが表示されません。 ただし起動した後、移動や削除を行おうとすると「使用中のため不可能」といったダイアログが出ます。 Windows のタスクマネージャで見るとその実行ファイルが生きているようです。 バックグラウンドになっているようです。 わかりにくいので WindowX::CMain::main(...) の中に メッセージボックスを表示して printfデバッグしてみました。 すると上記だと "2" まで出力されますがそれ以降は...ということで多分 メッセージループから抜けていないのが原因だと思います。 これの前は ``` class WMainWindow : public QWidget, public ( IMainWindow ){ private: QMainWindow* window_; public: void show( void ){ window_->show(); } }; ``` みたいにして QMainWindow をコンポジションして 間接的にやっていました。 しかしこの方法だとメッセージ ( WinAPIだと WM_COMMAND 等 ) が発行されないのか、 なかなか動きません。 で調べてみるとQMainWindowを継承して イベントハンドラを実装すればいいということで、質問の最初に出てきたコードでやってみました。 それまではイベント関係以外はうまく行っていたのですが、コンポジションじゃなくて継承のほうだとウィンドウそのものが表示されません。 以前、Q_OBJECTマクロをつけろ。といわれたのですが、 実際に ``` class WMainWindow : public ...{ Q_OBJECT public: ... }; ``` みたいにするとエラーが出ました。 今外出先で手元にないのでエラーメッセージは忘れましたが、「Q_OBJECTって何?」という感じのエラーだった気がします。 どのようにすればいいのでしょうか。 目標としては ``` [DLL側とEXE側] IMainWindow等の開示 [DLL側] IMainWindowを実装したWMainWindowオブジェクトを返す [EXE側] 開示されているインターフェースを通して間接的に操作する ``` です。 [情報] 言語: C++ ライブラリ: Qt 5.6 コンパイラ: MinGW 宜しくお願い致します。
回答: **環境:Win10 / VS2015Community / Qt5.6** > > 「Q_OBJECTって何?」という感じのエラー > > > ヘッダファイルでクラスを定義しないと、エラーが出たかと。 ちょっとMinGWでどのようなメッセージが表示されるかはわかりません。 ソースを分割しなかった場合 ``` #include class Sample : public QObject { Q_OBJECT }; int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); Sample *sample = new Sample; delete(sample); return app.exec(); } ``` **ビルドエラー** ``` 1>main.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __cdecl Sample::metaObject(void)const " (?metaObject@Sample@@UEBAPEBUQMetaObject@@XZ) 1>main.obj : error LNK2001: unresolved external symbol "public: virtual void * __cdecl Sample::qt_metacast(char const *)" (?qt_metacast@Sample@@UEAAPEAXPEBD@Z) 1>main.obj : error LNK2001: unresolved external symbol "public: virtual int __cdecl Sample::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Sample@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z) 1> ... QtConsoleApplication1.exe : fatal error LNK1120: 3 unresolved externals ``` ソースを分割した場合 ``` #pragma once #include class Sample : public QObject { Q_OBJECT }; ``` ``` #include #include "Header.hpp" int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); Sample *sample = new Sample; delete(sample); return app.exec(); } ``` こちらはエラーなしです。 ビルドのゴミが残っているとエラーを吐くので、その際はリビルドしてください。 生成されたmoc_xxxファイルを消してしまうのもありです。 そもそも ・Windowsでしか使う予定がない ・Windows APIに慣れている ・Qtは慣れないのでWindows API風に使いたい **もうQtを使う理由がないのでは...?** クラス化も何も、Qtはもともとクラス化されてますよ。