質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • C++

    3430questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Qt

    141questions

    QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

[Qt]Qtをクラス化する

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 444

BeatStar

score 1015

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

宜しくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

環境:Win10 / VS2015Community / Qt5.6

「Q_OBJECTって何?」という感じのエラー

ヘッダファイルでクラスを定義しないと、エラーが出たかと。
ちょっとMinGWでどのようなメッセージが表示されるかはわかりません。

ソースを分割しなかった場合

#include <QtCore/QCoreApplication>

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 <QtCore/QCoreApplication>

class Sample : public QObject {
    Q_OBJECT
};
#include <QtCore/QCoreApplication>
#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はもともとクラス化されてますよ。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C++

    3430questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Qt

    141questions

    QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。