現在開発中のアプリケーションを通して、私の混乱を説明してみます。
私のアプリケーション (Qt5.1 + Qt Quick Controls に基づく) は、Facebook API とやり取りして Facebook ページを管理します。QML コード (UI 用) を C++ コアからできるだけ分離しようとしています。
現在、Facebook API と対話できるようにするには、OAuth2 実装が必要です。そのために、C++ OAuth2 クラスがあり、そのコンストラクターには次のシグネチャがあります。
OAuth2::OAuth2(QString appId, QString redirectUrl, QStringList パーミッション);
ここで、OAuth プロセスにはブラウザーが必要なので、OAuth2 を使用して承認を完了する OAuthBrowser.qml も実装しました。
OAuth2 クラスを OAuth2Browser に公開するには、次のオプションがあります。
- OAuth2 をインスタンス化し、setContextProperty() を使用してインスタンスを OAuth2Browser に公開します。ただし、これは私の C++ コードが UI コードを処理する必要があることを意味します。さらに不可解な問題は、OAuth2Browser がセカンダリ ウィンドウであることです。ユーザーが MainWindow の「Authorize」ウィンドウをクリックすると、
(MainWindow に接続された) AppController C++ オブジェクトが OAuth2Browser ウィンドウを起動します。したがって、OAuth2Browser のインスタンス化コードは、AppController メソッドの奥深くに入ります。main.cpp だけがウィンドウの作成を処理すればよかったのに。 - qmlRegisterType() を使用します。この場合、コンストラクターにパラメーターを渡すことはできません。そのため、OAuth2 オブジェクトを初期化する init() メソッドを実装する必要があります。次に、OAuth2Browser の Component.onCompleted() メソッドでこの init() メソッドを呼び出します。しかし、このアプローチでは、QSettings を UI コード - QML ウィンドウに公開する必要があります。取得されます。アプリケーション設定を QML UI に直接公開することが良い考えかどうかについて、私は非常に懐疑的です。
- OAuth2 コンストラクター内で暗黙的に QSettings を使用します。この方法では、パラメーターを渡す必要はなく、qmlRegisterType() を使用できます。ただし、これは、「カーテンの後ろ」で魔法のようなことをしていることを意味します。QSettings インスタンスを明示的に渡す代わりに、好きな場所でそれを使用しているため、パブリック API から初期化の詳細を隠しています。
3 番目のオプションに基づく代替案が IRC でアドバイスされました。パラメーターがコンストラクターに渡されない場合は、initFromSettings() タイプのメソッドを使用してインスタンスを初期化します。そうすれば、初期化は隠されず、initFromSettings() はそれ自体で QSettings を自信を持って使用できます。これで、qmlRegisterType() を使用して QML で OAuth2 をインスタンス化できるようになりました。
それで、より良いアプローチは何ですか?
また、
- QSettings を QML UI に直接公開することは良い考えですか?
- 個人的には、setContextProperty() よりも qmlRegisterType() を好みます。登録されたクラスのインスタンスの有効期間は、QML によってのみ維持されます。ただし、初期化のために何らかの形式の init() が
明示的に使用されない限り、パラメーター化されたコンストラクターがサポートされていないため、前者が使用される可能性は低くなります。それは良いデザインですか?
とてつもなく長い文章を前もってお詫びします。でもここで聞いてよかったと思いました。