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