实现可以滚动的图像查看器以及图像的响应缩放

时间:2013-09-17 04:42:18

标签: gtk

我正在尝试使用GTK + 3实现图像查看器,它应该有两种模式:

  1. 适合某种模式(适合宽度/高度)
  2. 原始尺寸模式
  3. 现在,在两种模式中,我都需要图像可滚动,而在适合X时,我需要知道“显示图像区域”的实际大小,这实际上是直接可见的窗口区域。此外,由于窗口可以调整大小,我需要动态缩放图像。

    在Qt中,它是just a breeze。没有第三方库(gdkpixbuf),无需创建自定义小部件,无后顾之忧。

    我可以为QLabel设置图像,在调整大小时,我可以平滑地缩放图像(不依赖于任何第三方库,如gdkpixbuf)到新的大小(似乎不可能获得当前大小GTK +由于某些convoluted reasons显然不适用于Qt;为了获得“图像竞技场”的大小,Comix获取总窗口尺寸,减去菜单栏的尺寸,滚动条,工具栏和get_visible_area_size中的滚动条如果可见!)。使用正确的参数,这可以很好地适应扩展和收缩,父滚动区域可以根据QLabel的大小进行滚动。

    但令我惊讶的是,如果我没有遗漏某些东西,那么使用GTK +的开箱即用小部件是不可能的。

    这是我到目前为止所尝试的内容:

    • 直接使用布局,手动移动图像对象,并添加&手动处理水平和垂直滚动条(当然,手动处理信号并在布局内移动()图像)。这就是Comix的作用!这很糟糕,所以我在中途停止这样做。

    • 在ScrolledWindow + Viewport中放置一个图像对象:滚动得很整齐,但问题是,我不知道ScrolledWindow的“直接可见”部分的可见大小(也不是封装窗口或Viewport ); get_allocation返回总图像区域的大小,即可见部分加上不可见部分(用户可以通过滚动查看)。 在“普通”调整大小事件之后,Viewport的分配会报告正确的大小,但它会在最大化/最小化之后报告先前的大小(我正在监听窗口状态事件和配置事件)。我认为这是一个长期存在的GTK +错误行为。

    我已经筋疲力尽的其他事情:

    • 检查page_size调整字段:返回最大化/最小化后的旧值
    • 检查configure-event中的width和height字段:即使在最大化/最小化之后也可以正常工作,但是,不会为GtkViewport或GtkScrolledWindow调度configure-event,所以我只能使用父级那个窗口。不幸的是,由于一些其他小部件(状态栏,工具栏等),父窗口大小比视口大。

    如果GTK +提供了基本解决的问题:

    • 获取ScrolledWindow中可见区域的实际大小的方法。
    • 并且可选地,一种禁用ScrolledWindow中滚动的方法。

    我的问题是,我错过了一些明显的东西吗?很难相信这样一个基本的东西不能直接使用这种已建立的库的开箱即用的小部件来完成。实现可以滚动的图像查看器以及响应图像缩放的最简单方法是什么?

3 个答案:

答案 0 :(得分:2)

我也在创建an image viewer!我可以告诉你这实际上很容易实现。您需要做的就是获取GtkScrolledWindow的子窗口小部件。

我在我的图片查看器上使用的解决方案使用自定义窗口小部件,它实现了GtkScrollable界面并渲染了图像。如果您使用了一个,则该自定义窗口小部件分配是"可见区域的尺寸"。

如果您使用GtkViewport代替(通过gtk_scrolled_window_add_with_viewport?),则GtkViewport分配是GtkScrolledWindow的可见区域。 GtkViewport子窗口小部件始终处于请求的大小,该大小可能大于GtkScrolledWindow可见区域。

无论哪种方式,您使用gtk_bin_get_child获取GtkScrolledWindow的子窗口小部件,然后在该GtkWidget上使用gtk_widget_get_allocation来获取其分配。该分配是"可见区域"没有滚动条的滚动窗口。

答案 1 :(得分:1)

我发现我正在听错事件:我正在听窗口的“配置事件”,它在最小化/最大化期间不会触发。听“尺寸分配”解决了这个问题。

感谢大家的回答!

答案 2 :(得分:-1)

我认为你的要点是:

  

获取ScrolledWindow中可见区域的实际大小的方法。

通过查询滚动条可视化的GtkAdjustments可以轻松处理

。调整的“page_size”应对应于当前可见区域。