QutIMの新しいバージョンを開発する過程で、古いシステムには多くの欠点があったため、通知システムを書き直す必要がありました。
少し前に、Qtに登場した新機能に特化した
トピックがHabréに登場しました。 特に、アニメーション化されたユーザーインターフェイスの作成を容易にするために設計された新しいフレームワークについて説明します。 親愛なる読者がまだ最新でない場合は、この記事を最初に読むことをお勧めします。
可能性を示す短いビデオ:
エントリー
レビュー記事では、Qt.Labsで見つけた価値あるフレームワークの1つ、つまり
Kineticがバイパスされました。
著者は次のことを約束します。
- アニメーションフレームワーク -あらゆる種類のウィジェットに対して、単純なタイプと複雑なタイプの両方のアニメーションを作成する機能。 既製のアニメーション、カスタムを追加および作成する機能を提供します。
- インターフェイスの宣言的な作成 -既成のテンプレートを操作するのではなく、プロパティを記述することでインターフェイスを定義します。
- 高度なグラフィックス機能 -影、透明度、フィルターなどの追加
美味しそうですね? それゆえ、私は忍耐と未知への覚悟を持って、小さな例を書きました。 私はそれが予想よりもはるかに短い時間がかかったことに注意してください。
通知はスムーズに移動しました。 それらは常に隣接するものと重ならないように整列し、テキストが収まらない場合、ウィンドウは自動的に拡大縮小されます。
通知データを表示できるライブラリを作成するには何が必要ですか?
- KineticNotifications-このクラスを通じて通知が送信されます。 このクラスは、通知の表示とアニメーション化を担当します。
- NotificationWidget -Pamoポップアップ通知は、フレームが削除され、アルファチャネルが追加されたQTextBrowserです。
- 通知マネージャー -実行中のすべての通知へのポインターを格納し、その配置を管理し、設定も提供するシングルトン。
プログラムコード
通知をトリガーするには、数行で十分です。
- KineticNotification * notify = new KineticNotification ( "id" 、 timeout ) ;
- notify- > setMessage ( QString :: fromUtf8 ( "Test" ) 、
- QString :: fromUtf8 ( "メッセージ" ) 、
- 「./images/avatar.jpg」
- ) ;
- connect ( notify 、 SIGNAL ( action2Activated ( )) ) 、 QApplication :: instance ( ) 、 SLOT ( quit ( ) ) )) ;
- 接続 (通知、 SIGNAL ( action1Activated ( ) )) 、 SLOT ( nextNotify ( ) ) ) ;
- 通知-> 送信 ( ) ;
各通知には固有の識別子が割り当てられますが、一意である必要があります。 これにより、たとえば、行に追加するために、識別子が既存の通知へのポインタを取得できます。
これは非常に簡単な方法で行われます:
- KineticNotification * notify = NotificationsManager :: self ( ) -> getById ( "id" ) ;
- if ( notify != 0 ) {
- notify- > appendMessage ( QString :: fromUtf8 ( "テキスト行を追加" ) ) ;
- }
要求されたIDを持つ通知がない場合、関数は0を返すことに注意することが重要です。
次に、最も重要なこと、つまりステートマシンの動作を説明することに移りましょう。
最初に、マシンのすべての状態を作成する必要があります。 それらの3つがあります。
- show_state-画面に表示される通知
- hide_state-通知は非表示です
- final_state-この位置はステートマシンを停止します
状態のシーケンスを設定します。
- show_state- > addTransition ( notification_widget 、 SIGNAL ( action1Activated ( ) ) 、 hide_state ) ;
- show_state- > addTransition ( notification_widget 、 SIGNAL ( action2Activated ( ) ) 、 hide_state ) ;
- hide_state- > addTransition ( hide_state 、 SIGNAL (洗練された( ) ) 、 final_state ) ;
- show_state- > addTransition ( this 、 SIGNAL ( updated ( ) ) 、 show_state ) ; //ちょっとしたトリック
最後の行では、必要に応じて、以前に描画した通知の画面上の位置を変更するために、マシンの追加の状態なしで実行できます。 その後、通知の初期位置(画面の右端の後ろ)と、show_state状態に移行して通知がとる位置を設定する必要があります。 ウィジェットの位置とサイズは、引数がQRectであるsetGeometryメソッドを使用して設定できます。引数はQRectです。これは、左上の点の座標とその長さおよび高さを持つ長方形にすぎません。
画面上のどの時点で通知を作成する必要があるか、また後でどこに移動するかを知るには、前のウィジェットの位置を知るか、そのような右下隅がない場合に知る必要があります。
- QRect geom = QApplication :: desktop ( ) -> availableGeometry ( QCursor :: pos ( ) ) ;
その結果、マウスポインターが置かれているモニターの角度を取得します!
開始点が受信されたので、テキストを設定し、ウィジェットの高さを最適なものに変更して、表示されるすべてのテキストと画像がそれに適合するようにします。
- this- > document ( ) -> setHtml ( data ) ;
- this- > document ( ) -> setTextWidth ( NotificationsManager :: self ( ) -> defaultSize。width ( ) ) ;
- int width = NotificationsManager :: self ( ) -> defaultSize 。 幅 ( ) ;
- int height = this- > document ( ) -> size ( ) 。 高さ ( ) ;
- QSize (幅、高さ)を 返し ます。
ある段階から別の段階へのマシンの移行に必要な条件と条件は、どの段階に従うかを必ず設定してください
- if ( timeOut > 0 ) {
- startTimer ( timeOut ) ;
- show_state- > addTransition ( this 、 SIGNAL ( timeoutReached ( ) ) 、 hide_state ) ;
- }
- マシン。 addState ( show_state ) ;
- マシン。 addState ( hide_state ) ;
- マシン。 addState ( final_state ) ;
- マシン。 setInitialState ( show_state ) ;
ただし、通知の位置とサイズは定期的に変更する必要があります。たとえば、下のウィジェットが消えた場合、空のスペースを作成しないように他のすべての通知を下に移動する必要があります。 同じことがテキストの追加にも当てはまります。遅かれ早かれ、ウィジェットのサイズを変更し、それに応じて他のすべてを移動して、他のウィジェットと重複しないようにする必要があります。 さらに、チェーン全体の位置を正しく再計算する必要があるため、通知の最終位置を知ることは非常に重要です。 そうしないと、移動の過程で通知の瞬時の位置とサイズを取得できます。その結果、ウィジェットは誤った位置に移動します。
更新するには、シングルトンで関数を呼び出すだけで、画面の右下の端からウィジェットの位置が再計算されます。
- NotificationsManager :: self ( ) -> updateGeometry ( ) ;
各ウィジェットで、位置とサイズを更新する機能を呼び出します。
- show_state- > assignProperty ( notification_widget 、 "geometry" 、 geom ) ;
- updateGeometry ( geom ) ;
- geom。 moveRight ( geom。right ( ) + notification_widget- > width ( ) + NotificationsManager :: self ( ) -> margin ) ;
- hide_state- > assignProperty ( notification_widget 、 "geometry" 、 geom ) ;
したがって、ウィジェットの位置またはサイズの変更につながる可能性のあるイベントには、更新関数を呼び出すだけで十分です。 このようなイベントには、ウィジェットの削除と追加の行の追加が含まれます。
一般に、それは非常に機能的で簡潔であることが判明しました。
おわりに
通知ウィジェットの実装に興味があり、ライブラリの詳細を知り、それを使用することに興味がある人、ソースへのリンク 、LGPLライセンス。 このプログラムはQt4.6tp1、キネティックブランチ4.5ブランチでテストされており、Qt SolutionsのQAnimationFrameworkで動作するはずです。
使って楽しむ
NBハブにアカウントを持っていないが、コミュニティに熱心に参加したいQutIM開発チームからの1人の良い人のリクエストで公開されました。 こちらが彼のメールです:sauron@citadelspb.com
UPD: Gorthauer87へようこそ!