3

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

  1. 适合某物模式(适合宽度/高度)
  2. 原稿尺寸模式

现在,在这两种模式下,我都需要图像是可滚动的,并且在 fit-to-X 中,我需要知道“显示图像区域”的实际大小,它实际上是直接可见的窗口区域。另外,由于窗口可以调整大小,我需要动态缩放图像。

在 Qt 中,这只是轻而易举的事。没有第三方库(gdkpixbuf),无需创建自定义小部件,不用担心。

我可以为 QLabel 设置图像,并且在调整大小时,我可以平滑地将图像(不依赖于任何 3rd 方库,如 gdkpixbuf)缩放到新大小(似乎不可能使用 GTK+ 获得当前大小,因为一些显然不适用于 Qt 的复杂原因;为了获得“图像区域”的大小, Comix获取总窗口尺寸,如果它们是可见的,则在get_visible_area_size中减去菜单栏、滚动条、工具栏和滚动条的尺寸!) . 使用正确的参数,这对于扩展和收缩都很好,并且父滚动区域可以根据 QLabel 的大小进行滚动。

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

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

  • 直接使用 Layout,手动移动 Image 对象,手动添加和处理水平和垂直滚动条(当然,手动处理 Layout 内图像的信号和 move()ing)。这就是Comix所做的!这太可怕了,所以我中途停止了这样做。

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

我已经用尽的其他东西:

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

如果 GTK+ 提供:

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

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

4

3 回答 3

3

我也在创建一个图像查看器!我可以告诉你,这实际上很容易实现。您需要做的就是获取GtkScrolledWindow.

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

如果您使用的是 aGtkViewport而不是(通过gtk_scrolled_window_add_with_viewport可能?),那么该GtkViewport分配是GtkScrolledWindow. 子GtkViewport小部件始终处于其请求的大小,可能大于GtkScrolledWindow可见区域。

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

于 2013-09-30T10:29:56.843 回答
1

我发现我正在侦听错误的事件:我正在侦听在最小化/最大化期间不会触发的窗口的“配置事件”。听“size-allocate”解决了这个问题。

感谢大家的回答!

于 2013-10-11T08:02:55.933 回答
-1

我认为你的主要观点:

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

GtkAdjustments通过查询滚动条的可视化可以轻松处理。调整的“page_size”应该对应当前可见区域。

于 2013-09-18T10:52:22.360 回答