FC2ブログ

MFCからQtのモジュールを使用する方法

Qtの機能をMFC使えるか試してみました。

Qtにはメタ処理や、イベントハンドリングなどのややこしい部分があるのですが、MFCから使えるのか疑問だったのですが、
今回試したやり方を使えば、イベント機能などをMFCと併用する方法まではわかりませんが、少なくとも基本的な機能については普通に使えることがわかりました。

今回は例として、MFCからQImageを使って画像の入出力を行ってみました。

Qtで画像の入出力を行うには、QImageというクラスを使いますが、インタフェースが非常にシンプルで、

QImage img;
img.load("a.png");
img.save("b.bmp");

のように書くだけで、簡単に実行することができます。

MFCから上記機能を呼び出す場合もそれは同様なのですが、QImageはフォーマットの制御を別dllにプラグインとして
実装するというアーキテクチャになっていますので、MFCのコードの中に上記のコードをただ記述するだけでは、PNG、BMP
などの基本的なフォーマットしか扱うことができません。

ですので、まずはプラグインdllの配置と、プラグインの読み込みを行う必要があります。

・プラグインの配置

まずはQtに付属している画像フォーマットプラグインを適切な位置にコピーしてやる必要があります。

snap_002_150102_214231.png

たとえば、今実装しているプログラムが上図の「MFCApplication1.exe」である場合、その実行ファイルと同じフォルダに
Qtのランタイム内に付属されている「imageformats」という名前のプラグインフォルダがあるので、それをコピーします。
このときに、すべてのファイルではなく、デバッグ版であればデバッグ版DLL、リリース版であればリリース版DLLだけを
コピーすれば結構です。

ファイルの配置が完了すると、次はそのプラグインを読み込んでやる必要があります。
これは具体的には、プログラムのどこかに、QCoreApplication、またはそれを継承したインスタンスを1つだけ作成してやる
必要があります。

MFCの場合は、メインウィンドウの初期化処理あたりに適当にスタティックオブジェクトを作ってやればよさそうです。
たとえば、メインウィンドウが「CSampleDlg」という名前の場合、

BOOL CSampleDlg::OnInitDialog()
{
    static QCoreApplication QTApp(__argc, __argv);

    CDialogEx::OnInitDialog();

    ...
}

のように、冒頭に1行アプリケーションクラスのインスタンスを作ってやるだけで十分です。
ちなみに__argc、__argvというのは、MFCではなくVisualCの固有機能らしく、main関数の引数を参照するグローバル変数
のようなものなのです。

このインスタンスが初期化されるときに各種プラグインが読み込まれますので、あとは次のように普通にコードを記述する
だけで各種機能を呼び出すことができます。

void CSampleDlg::OnBnClickedButton1()
{
    QImage q;
    q.load("aaa.jpg");
    q.save("bbb.png");
}

スポンサーサイト

コメントの投稿

非公開コメント

カレンダー
11 | 2018/12 | 01
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
最新記事
カテゴリ
Qt (21)
SDL (2)
MFC (2)
検索フォーム
月別アーカイブ
最新コメント
最新トラックバック
RSSリンクの表示
リンク
リンク(管理用)
FC2カウンター