Qt for iOS,QtとObjective Cの混合プログラミング


私は一連のQtの博文と1冊の本「Qt on Androidコアプログラミング」を書いたので、最近Qtを使っている何人かの友达がQt for iOSのことを聞いています.私はこの方面の経験が特に少ないので、システム的な文章が書けません.申し訳ありませんが、満足のいく返事ができません.Jason’s Homeを読むことをお勧めします.私のブログの左側の欄の友情リンクにもあり、Qt for iOSの非常に有意義な文章を提供し、実践に基づいて、彼のAppはすでにApp Storeでオンラインになっています.
私については、この文章では、QtとOCのプログラミングを混合する方法を簡単に紹介します.
私が言いたい内容は、ほとんどがQtヘルプにありますので、インデックスモードで「Qt for iOS」と入力し、Qt for iOSを見つけてみてください.開発環境の構築,アプリケーションのコンパイル,ハイブリッドOCプログラミングの3つの側面を紹介し,非常に詳細である.
もしあなたが英語をかじりたくないなら、私の文章を続けて下を見てもいいです.
プロジェクトの設定
QtハイブリッドOCプログラミングについてお話しする以上、まずObjective Cについて簡単に紹介します.私はただ一言:Go、検索エンジンに聞いてください.私の知っていることは本当に限られているので、あなたを誤解させるのではないかと心配しています.もちろん怖くないなら、下を見てください.
OCソースファイルの紹介
まずObjective Cのソースファイルについてお話しします.接尾辞は.mまたは.mm,在.mmファイルでは、C++コードをそのまま使用できます.したがって、QtコードとOCコードを混合するには、Qtプロジェクトにmmファイルを追加する必要があります.
Proファイル構成
Qt SDK for Mac、インストール後、Qt CreatorはXCodeが提供するコンパイルツールチェーンを使用してコードをコンパイルし、mmファイルを正しくコンパイルしたり、iOSのライブラリファイルをリンクしたりすることができます.
OCコードをブレンドするにはproファイルを変更する必要があります.1つはmmファイルを追加し、1つはiOS用のライブラリファイルを接続します.
ソースファイルを追加し、OBJECTIVE_を使用SOURCESという変数、例えば味噌紫:
OBJECTIVE_SOURCES += ocview.mm

リンクライブラリXCodeが提供するライブラリは、QMAKE_を使用する必要があります.LFLAGS、味噌紫に似ています:
ios {
    QMAKE_LFLAGS    += -framework OpenGLES
    QMAKE_LFLAGS    += -framework GLKit
    QMAKE_LFLAGS    += -framework QuartzCore
    QMAKE_LFLAGS    += -framework CoreVideo
    QMAKE_LFLAGS    += -framework CoreAudio
    QMAKE_LFLAGS    += -framework CoreImage
    QMAKE_LFLAGS    += -framework CoreMedia
    QMAKE_LFLAGS    += -framework AVFoundation
    QMAKE_LFLAGS    += -framework AudioToolbox
    QMAKE_LFLAGS    += -framework CoreGraphics
    QMAKE_LFLAGS    += -framework UIKit
}

上は私がQtを使ってiOSのプログラミングの構成です.iOS向けのライブラリをたくさん使っているのでframeworkをたくさん追加しました.
「-framework UImit」というパラメータは、Makefileを介してClangに渡されるパラメータです.-frameworkは、あるフレーム(またはライブラリ)にリンクすることを示すキーワードで、その後ろにフレーム(ライブラリ)名が付いています.
注意が必要なのは、iOS向けのライブラリを使用しているので、「LIBS+=」という方法で導入するわけではありませんよ.もちろん、あなた自身がQtで実現しました.aライブラリは,依然として「LIBS+=」という方式を用いる必要がある.
plistファイルの指定
プロジェクトにplistファイルを指定する必要がある場合があります.plistファイルのフルネームはProperty Listで、接尾辞は.plist .これはiOSアプリケーションのプロパティを定義するために使用されます.Bundle(iOS上のアプリケーションはBundleと呼ばれています)の表示名、実行可能なファイル名、署名、証明書など、もちろん構成データを保存することもできます.具体的にはiOSが開発したドキュメントを参照してください.
Proファイルにplistを追加するにはQMAKE_を使用します.INFO_PLISTキーワード.以下のように味噌紫:
QMAKE_INFO_PLIST += MultiWindow.plist

さて、proファイルにおける混合OCに関する構成項目については、だいたいこれだけです.次に、Objective Cコードの書き方を見てみましょう.
混合使用Objective Cコード
おとなしくて、とても恐れて、これは私の弱点で、OCコードをあまり書いたことがありません.だから、OCに関する質問は聞かないでください.私は本当に知りません.
背景
私の例は、QMLのインタフェースにiOSのオリジナルのインタフェース、すなわちUIView、UIWindowなどを重畳したものです.OCはCの近親者なので、C++と天然の血縁を持っていて、混ぜるのがとても便利ですね.AndroidでJNIプログラミングを使うよりずっと使いやすいです.
しかし、OCには[]という文法が適用されています.XCodeを使うと、文法ヒントや自動完了機能が非常に強く、ほとんど考えずに使う関数が見つかります.Qt Creatorか、へへへ、こんなに仲良くないから、純粋に手書きだよ.私は当時XCodeを開いてAPIドキュメントを見て探していたので、苦痛でした.
QQQuickoiewって何?
私がテストした例は、Qt Quick Appプロジェクトテンプレートを使用し、QQQQuickmiewを使用してQMLドキュメントをロードします.ここでもこれを例に説明します.Qt Quickについては、私のブログのコラムを見てもいいし、私の本「Qt Quickコアプログラミング」を見てもいいし、本の中でシステムがQt Quickの基本概念を詳しく紹介し、豊富な例を提供しています.
まずQQQQuickVariewとは何かを言います.
QQQuickmiewは、実はUIViewです.UIViewはiOS開発フレームワークの多くのインタフェース要素のルートであり、例えばUIWindowはUIViewのサブクラスである.
QtのQQQuickoiewはUIViewで、QQQQuickoiewインスタンスを作成した後、UIViewがあり、Qtはいくつかの魔法を使って、UIViewのOpenGL Contextを手に入れて、Qtのイベントループを走って、このOpenGL Contextの上でゼロから自分のシーンとUIシステムを描きました.
このように簡単で、Qtソースコードを調べてさらに理解することができます.
なお、QMLインタフェース要素のレンダリングは、UIViewのようなオリジナルインタフェースのレンダリングとは1つのスレッドではありません.また、iOSはOpenGL ESをサポートしており、複数のOpenGL Contextを同時に使用することができます.より良いことに、ウィンドウモードでOpenGL Contextを作成することができます.Androidバージョンとは違ってQtがOpenGLを使用する場合はフルスクリーンモードで、ローカルアップデートはサポートされていないので、AndroidでQMLのCameraやVideoOutputを使用して写真アプリを開発する場合は、VideoOutputはフルスクリーンモード(fill_parentが必要)でなければなりません.iOSでは、この制限はありません.iOSは素晴らしいようです.
私は頼りにしています.少し遠くまで話しています.最近技術的な文章を書くのが少なくなって、ますますくどくどしています.本題に戻りましょう.
QQQQuickValiewは実際にはUIViewなので、強制的にUIViewに変換してOCの方法を使って新しいUIViewやUIWindowを作成することができ、このようにオリジナルのUIコンポーネントができ、このオリジナルのUIコンポーネントでOpenGLを使って自分のものを描くか、他のオリジナルのコントロールを追加することができ、とても素晴らしいです.
しかし、この方法で作成されたiOSオリジナルのインタフェース要素は、常にQMLインタフェースの上にあり、QMLシーンのインタフェース要素を覆っていることを説明します.
ハイブリッドコード
OCのクラスライブラリを使用するには、mmファイルに関連するヘッダファイルを含める必要があります.また、いくつかの作業が必要です.一つはproファイルにSDKパスを入れ、INCLUDEPATH変数を使えばいいので、多くは言いません.もう一つはmmファイルにOCのヘッダファイルが含まれていて、C++ヘッダファイルと同じ理屈ですが、#importを使いますよ.味噌紫に似ています:
#import <UIKit/UIKit.h>
#import <GLKit/GLKit.h>

ヘッダファイルが含まれていれば、OCクラスライブラリを使用できます.例えばQQQQuickmiewの上に新しいiOS原生のUIViewを作成します.mmファイルでは、次のことができます.
void addOCView(QQuickWindow *w)
{
    UIView *view = reinterpret_cast<UIView *>(w->winId());

    CGRect  viewRect = CGRectMake(10, 10, 100, 100);
    UIView* myView = [[UIView alloc] initWithFrame:viewRect];
    [myView setBackgroundColor:[UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:1.0]];
    [view addSubview: myView];
}

ご覧のように、私はaddOCViewメソッドを書きました.そのパラメータはQQQuickmiewです.addOCViewメソッドでQQQuickmiewを強制的にUIViewに変換して使用しました.
新しいUIViewを作成し、その背景色を設定してQQQuickNiewのサブウィンドウに追加しました.ノ、簡単だよ.
言ってみろcppはaddOCView()メソッドをどのように使用するかを見ます.コードは次のとおりです.
int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQuickView viewer;
    viewer.setResizeMode(QQuickView::SizeRootObjectToView);
    viewer.setSource(QUrl("qrc:/main.qml"));
    viewer.show();

    addOCView(&viewer);

    return app.exec();
}

少しも驚かないでしょう.addOCViewを直接呼び出しましたよ.ははは、確かにそうです.
iOSオリジナルインタフェースとQML要素の位置マッピング
iOSネイティブインターフェースを混合して使用する場合、ネイティブインターフェースとQMLインターフェースのシームレスな統合を達成することもできます.重要なのは、QMLインタフェース要素の位置を計算し、QMLインタフェース要素の位置に基づいてオリジナルインタフェースの位置を設定することです.
QML要素位置換算
QMLは要素の位置を換算する方法を提供し、ItemはmapToItem()と呼ばれ、Qt Quick Itemに対する領域を別のItemにマッピングし、座標を得ることができる.例えばqmlファイルは次のようになります.
Rectangle {

    ...

    Rectangle {
        id: videoLayer;
        anchors.margins: 8;
        anchors.left: parent.left;
        anchors.right: parent.right;
        anchors.top: parent.top;
        anchors.bottom: actionBar.top;
        color: "green";
    }

    ...

}

オリジナルのUIViewをidがvideoLayerの要素の内部に配置したい場合は、次のように座標を換算して使用します.
var coordinate = videoLayer.mapToItem(null, 8, 8, videoLayer.width - 16, videoLayer.height - 16);
winUtil.addUIView(coordinate.x, coordinate.y, coordinate.width, coordinate.height);

換算したcoordinateにはx,y,width,height属性がある.mapToItemの最初のパラメータがnullである場合,換算の結果はQQQuickmiewに対して得られる.では、UIViewを追加すると、この換算結果でCGRectオブジェクトを構築し、このCGRectでUIViewの位置を初期化することができます.
UIViewの場所の設定
前の例のコードのwinUtilは私がC++内で実現した補助クラスで、QML環境にエクスポートされました.そのaddUIViewメソッドは,入力された座標に基づいてオリジナルのUIViewの位置を設定する.参照コードは次のとおりです.
    UIView *v = reinterpret_cast<UIView*>(view->winId());
    uiw = [[UIWindow alloc] initWithFrame:CGRectMake(x, y, width, height)];
    [v addSubview: uiw];

上のコードでは、viewはQQQQuickmiewです.今回は、UIViewを作成する際に、転送されたx、y、width、heightを使用しました.これにより、新しいUIViewはQML要素と統合され、一体のように見えます.
はい、これが全部です.