3

現在開発中のアプリケーションを通して、私の混乱を説明してみます。

私のアプリケーション (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 に公開するには、次のオプションがあります。

  1. OAuth2 をインスタンス化し、setContextProperty() を使用してインスタンスを OAuth2Browser に公開します。ただし、これは私の C++ コードが UI コードを処理する必要があることを意味します。さらに不可解な問題は、OAuth2Browser がセカンダリ ウィンドウであることです。ユーザーが MainWindow の「Authorize」ウィンドウをクリックすると、
    (MainWindow に接続された) AppController C++ オブジェクトが OAuth2Browser ウィンドウを起動します。したがって、OAuth2Browser のインスタンス化コードは、AppController メソッドの奥深くに入ります。main.cpp だけがウィンドウの作成を処理すればよかったのに。
  2. qmlRegisterType() を使用します。この場合、コンストラクターにパラメーターを渡すことはできません。そのため、OAuth2 オブジェクトを初期化する init() メソッドを実装する必要があります。次に、OAuth2Browser の Component.onCompleted() メソッドでこの init() メソッドを呼び出します。しかし、このアプローチでは、QSettings を UI コード - QML ウィンドウに公開する必要があります。取得されます。アプリケーション設定を QML UI に直接公開することが良い考えかどうかについて、私は非常に懐疑的です。
  3. OAuth2 コンストラクター内で暗黙的に QSettings を使用します。この方法では、パラメーターを渡す必要はなく、qmlRegisterType() を使用できます。ただし、これは、「カーテンの後ろ」で魔法のようなことをしていることを意味します。QSettings インスタンスを明示的に渡す代わりに、好きな場所でそれを使用しているため、パブリック API から初期化の詳細を隠しています。

3 番目のオプションに基づく代替案が IRC でアドバイスされました。パラメーターがコンストラクターに渡されない場合は、initFromSettings() タイプのメソッドを使用してインスタンスを初期化します。そうすれば、初期化は隠されず、initFromSettings() はそれ自体で QSettings を自信を持って使用できます。これで、qmlRegisterType() を使用して QML で OAuth2 をインスタンス化できるようになりました。

それで、より良いアプローチは何ですか?

また、

  1. QSettings を QML UI に直接公開することは良い考えですか?
  2. 個人的には、setContextProperty() よりも qmlRegisterType() を好みます。登録されたクラスのインスタンスの有効期間は、QML によってのみ維持されます。ただし、初期化のために何らかの形式の init() が
    明示的に使用されない限り、パラメーター化されたコンストラクターがサポートされていないため、前者が使用される可能性は低くなります。それは良いデザインですか?

とてつもなく長い文章を前もってお詫びします。でもここで聞いてよかったと思いました。

4

1 に答える 1

0

非常に長く、情報が密集しているため、投稿を完全にフォローすることは困難です。それらが価値があるかもしれないものについての私の提案はここにあります.

良いデザインとは何かを知りたいと思っていますが、目標を特定していません。目標を列挙できなければ、目標をどれだけ達成したかを実際に評価することはできません。

FacebookのAPIを扱っています。私の水晶玉は、変化はあなたが対処する必要があるものだと言っています。したがって、すべてのツールを qml に入れることで、変化への対応が向上する可能性があります。再コンパイルする代わりに、qml ファイルで JavaScript を書き換えることで、変更に対応できます (うまくいけば)。プロパティとシグナル/スロットの設計を使用すると、仕事を完了するのに十分な柔軟性が必要です。性能は問題ないようです。

保存したいものを公開する設定オブジェクトを作成します。おそらく、Qt が既に提供しているモデル/ビュー アーキテクチャを使用しています。基になるストレージ、xml ファイル、データベース、QSettings レジストリは重要ではありません。グリッド/リストを提供して、ユーザーが必要に応じて設定を更新できるようにすることができます。

oauth とブラウザー ツールをオブジェクトとしてまとめて、qml でアプリの動作をスクリプト化できるようにします。

C++ オブジェクトを公開するこれらのツールは、コミュニティと共有するのにも優れたものになる可能性があります。

幸運を!

于 2013-09-04T18:11:15.277 に答える