3

GTK+3 を使用して画像ビューアを実装しようとしていますが、次の 2 つのモードが必要です。

  1. あるものに合わせるモード (幅/高さに合わせる)
  2. 原稿サイズモード

さて、両方のモードで、画像をスクロール可能にする必要があり、fit-to-X では、実際に直接表示されるウィンドウ領域である「表示画像領域」の実際のサイズを知る必要があります。また、ウィンドウのサイズを変更できるため、画像を動的にスケーリングする必要があります。

Qt では、簡単です。サードパーティ ライブラリ (gdkpixbuf) は不要で、カスタム ウィジェットを作成する必要もありません。

QLabel の画像を設定でき、サイズ変更時に、(gdkpixbuf などのサードパーティ ライブラリに依存することなく) 画像を新しいサイズにスムーズにスケーリングできます (GTK+ では現在のサイズを取得できないようです。明らかに Qt には当てはまらないいくつかの複雑な理由; 「イメージ アリーナ」のサイズを取得するために、 Comixはウィンドウの合計サイズを取得し、メニューバー、スクロールバー、ツールバー、およびスクロールバーが表示されている場合はget_visible_area_sizeのサイズを差し引きます!) . 正しいパラメーターを使用すると、これは拡大と縮小の両方でうまく機能し、親スクロール領域は QLabel のサイズに応じてスクロールできます。

しかし驚いたことに、GTK+ ですぐに使用できるウィジェットを使用すると、そのような初歩的なことを行うことはできません。

これまでに試したことは次のとおりです。

  • レイアウトを直接使用し、Image オブジェクトを手動で移動し、水平および垂直スクロールバーを手動で追加および処理します (もちろん、信号を処理し、レイアウト内の画像を手動で move() します)。これがComixのすることです!これはひどいので、途中でやめました。

  • ScrolledWindow + Viewport内に画像オブジェクトを配置しました:スクロールはきれいですが、問題は、ScrolledWindowの「直接見える」部分(カプセル化ウィンドウまたはViewportも)の表示サイズがわからないことです。get_allocation は、画像領域全体のサイズ、つまり、表示されている部分と表示されていない部分 (ユーザーがスクロールすると表示される部分) を合わせたサイズを返します。ビューポートの割り当ては、「通常の」サイズ変更イベントの後に正しいサイズを報告しますが、最大化/最小化の後に以前のサイズを報告します (window-state-event と configure-event の両方でリッスンしています)。これは長年の GTK+ のバグだと思います。

私が使い果たした他のもの:

  • 調整の page_size フィールドの確認: 最大化/最小化後に以前の古い値を返します
  • configure-event の width フィールドと height フィールドのチェック: 最大化/最小化の後でも問題なく動作します、configure-event は GtkViewport または GtkScrolledWindow に対してディスパッチされないため、そのためには親ウィンドウしか使用できません。残念ながら、他のウィジェット (ステータスバー、ツールバーなど) のために、親ウィンドウのサイズがビューポートよりも大きくなっています。

GTK+ が提供する場合、問題は基本的に解決されます。

  • ScrolledWindow の可視領域の実際のサイズを取得する方法。
  • オプションで、ScrolledWindow でスクロールを無効にする方法。

私の質問は、ここで明らかな何かが欠けていますか? このような確立されたライブラリを備えたすぐに使用できるウィジェットを使用して、このような基本的なことを直接実行できないとは信じがたいです。スクロールと画像のレスポンシブスケーリングを実行できる画像ビューアを実装する最も簡単な方法は何ですか?

4

3 に答える 3

3

画像ビューアも作成中です!そして、これは実際にはかなり簡単に実装できると言えます。の子ウィジェットを取得するだけですGtkScrolledWindow

画像ビューアーで使用したソリューションでは、インターフェイスを実装して画像をレンダリングするカスタム ウィジェットを使用しました。GtkScrollable使用した場合、そのカスタム ウィジェットの割り当ては「可視領域」の寸法です。

GtkViewport代わりに(gtk_scrolled_window_add_with_viewport多分?)を使用している場合、そのGtkViewport割り当てはの可視領域ですGtkScrolledWindow。子ウィジェットは常に要求されたサイズであり、可視領域GtkViewportよりも大きい場合があります。GtkScrolledWindow

いずれにせよ、 を使用gtk_bin_get_childして a の子ウィジェットを取得し、その GtkWidget をGtkScrolledWindow使用gtk_widget_get_allocationしてその割り当てを取得します。その割り当ては、スクロールバーのないスクロールされたウィンドウの「可視領域」です。

于 2013-09-30T10:29:56.843 に答える
1

間違ったイベントをリッスンしていることがわかりました。最小化/最大化中に起動しないウィンドウの「configure-event」をリッスンしました。「size-allocate」を聞いて問題を解決しました。

答えてくれてありがとう!

于 2013-10-11T08:02:55.933 に答える
-1

私はあなたの主なポイントだと思います:

ScrolledWindow の可視領域の実際のサイズを取得する方法。

GtkAdjustmentsスクロールバーが視覚化するクエリを実行することで簡単に処理できます。調整の「page_size」は、現在表示されている領域に対応する必要があります。

于 2013-09-18T10:52:22.360 に答える