为什么在DrawingArea小部件(也使用Gtk.Button测试)上调用set_size_request(800,600)会导致窗口大小为958 x 791 px,而在窗口上调用set_default_size(800,600)会导致窗口大小合适(如测量的那样)通过截取窗口的截图并查看它的分辨率)?我会理解,由于窗户标题栏,高度会有一点差异,但宽度和高度的这种差异对我来说没有意义。文档没有提示任何类似的东西。如果有人能够启发我,那就太好了!
这是用vala编写的代码示例:
using Gtk;
using Cairo;
public class SizeTest : Gtk.Window {
public SizeTest () {
this.title = "Size test";
this.destroy.connect (Gtk.main_quit);
//set_default_size (800, 600); // Window size -> 800 x 600 px
var drawing_area = new DrawingArea ();
drawing_area.set_size_request (800, 600); // Window size -> 958 x 791 px
add (drawing_area);
}
static int main (string[] args) {
Gtk.init (ref args);
var test = new SizeTest ();
test.show_all ();
Gtk.main ();
return 0;
}
}
答案 0 :(得分:1)
从评论中看来,您已经检查过大小是否相同,但将其转换为实际答案。
让我们添加一个信号告诉我们窗口大小:
this.configure_event.connect ((event) => {
print ("Window::Size (px) Width: %d Height: %d\n", event.width, event.height);
return false;
});
结果代码为:
using Gtk;
public class SizeTest : Gtk.Window {
public SizeTest () {
this.title = "Size test";
this.destroy.connect (Gtk.main_quit);
this.configure_event.connect ((event) => {
print ("Window::Size (px) Width: %d Height: %d\n", event.width, event.height);
return false;
});
set_default_size (800, 600); // Window size -> 800 x 600 px
var drawing_area = new DrawingArea ();
//drawing_area.set_size_request (800, 600); // Window size -> 800 x 600 px
add (drawing_area);
}
static int main (string[] args) {
Gtk.init (ref args);
var test = new SizeTest ();
test.show_all ();
Gtk.main ();
return 0;
}
}
使用以下任一选项(Gtk.Widget.set_default_size
vs Gtk.Window.set_default_size
)运行测试应用程序将输出:
Window :: Size(px)宽度:800高度:600
虽然存在差异,但使用Gtk.Widget.set_size_request
将不允许小部件小于给定大小(因此Gtk.Window
),而使用Gtk.Window.set_default_size
将允许窗口收缩"收缩"低于初始大小。
来自API:
设置窗口的默认大小。
如果窗口的“自然”大小(其大小请求)大于 默认情况下,将忽略默认值。更一般地说,如果是默认值 大小不遵守窗口的几何提示( set_geometry_hints可用于显式设置这些,默认值 尺寸将被钳制到最接近的允许尺寸。
与set_size_request不同,后者为小部件设置大小请求 因此会阻止用户缩小窗口,仅此功能 设置初始大小,就像用户调整窗口大小一样 他们自己。用户仍然可以像往常一样再次缩小窗口 将。将默认大小设置为-1表示使用“自然”默认值 size(窗口的大小请求)。
设置小部件的最小大小;也就是小部件的大小请求 至少是高度宽度。
您可以使用此功能强制小部件比它大 通常是。
在大多数情况下,set_default_size是顶级的更好选择 窗口比这个功能;设置默认大小仍然允许 用户缩小窗口。设置大小请求将强制它们 离开窗口至少与尺寸要求一样大。什么时候 处理窗口大小时,set_geometry_hints可以是一个有用的函数 同样。
注意设置任何固定大小的固有危险 - 主题, 翻译成其他语言,不同的字体和用户操作 都可以更改给定小部件的适当大小。所以,它 基本上不可能硬编码总是正确的大小。
窗口小部件的大小请求是窗口小部件可以接受的最小大小 虽然仍然运作良好,并正确绘制自己。然而在 一些奇怪的情况,小部件的分配可能少于其请求 大小,并且在许多情况下,小部件可能被分配比它更多的空间 请求。 ...此处设置的大小请求不包含任何保证金 从Widget属性margin-left,margin-right,margin-top和 margin-bottom,但它确实包括几乎所有其他填充或 由Widget的任何子类设置的边框属性。