为什么 Gtk.Widget.set_size_request 和 Gtk.Window.set_default_size 会导致具有相同值的不同 Window 尺寸?
Why does Gtk.Widget.set_size_request and Gtk.Window.set_default_size result in different Window sizes with same values?
为什么 set_size_request(800,600) 调用 DrawingArea 小部件(也使用 Gtk.Button 测试)导致 Window 大小为 958 x 791 像素,而 set_default_size (800,600) 调用 Window 结果大小合适 window (通过截取 Window 的屏幕截图并查看其分辨率来衡量)?我能理解,由于 window header 栏,高度是否会有一点差异,但宽度和高度的这种差异对我来说没有意义。该文档没有暗示类似的事情。如果有人能开导一下,那就太好了!
这是一个用 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;
}
}
@张宗仁,感谢测试。我又试了一次,像你一样把它分成两个应用程序。 windows 的大小对我来说是完全不同的。我在我的两台显示器上都试过了 - 同样的事情。
顺便说一句,我用的是elementary OS 0.4.1 Loki,安装的libgtk-3-0版本是3.18.9.
从评论来看,您似乎已经检查过大小是否相同,但将其转化为实际答案。
让我们添加一个信号来通知我们 window 尺寸:
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) Width: 800 Height: 600
不过有一点不同,使用 Gtk.Widget.set_size_request
将不允许小部件小于给定的大小(因此 Gtk.Window
),而使用 Gtk.Window.set_default_size
将允许window 到 "shrink" 低于初始大小。
来自API:
-
Sets the default size of a window.
If the window’s “natural” size (its size request) is larger than the
default, the default will be ignored. More generally, if the default
size does not obey the geometry hints for the window (
set_geometry_hints can be used to set these explicitly), the default
size will be clamped to the nearest permitted size.
Unlike set_size_request, which sets a size request for a widget and
thus would keep users from shrinking the window, this function only
sets the initial size, just as if the user had resized the window
themselves. Users can still shrink the window again as they normally
would. Setting a default size of -1 means to use the “natural” default
size (the size request of the window).
-
Sets the minimum size of a widget; that is, the widget’s size request
will be at least width by height.
You can use this function to force a widget to be larger than it
normally would be.
In most cases, set_default_size is a better choice for toplevel
windows than this function; setting the default size will still allow
users to shrink the window. Setting the size request will force them
to leave the window at least as large as the size request. When
dealing with window sizes, set_geometry_hints can be a useful function
as well.
Note the inherent danger of setting any fixed size - themes,
translations into other languages, different fonts, and user action
can all change the appropriate size for a given widget. So, it's
basically impossible to hardcode a size that will always be correct.
The size request of a widget is the smallest size a widget can accept
while still functioning well and drawing itself correctly. However in
some strange cases a widget may be allocated less than its requested
size, and in many cases a widget may be allocated more space than it
requested. ... The size request set here does not include any margin
from the Widget properties margin-left, margin-right, margin-top, and
margin-bottom, but it does include pretty much all other padding or
border properties set by any subclass of Widget.
为什么 set_size_request(800,600) 调用 DrawingArea 小部件(也使用 Gtk.Button 测试)导致 Window 大小为 958 x 791 像素,而 set_default_size (800,600) 调用 Window 结果大小合适 window (通过截取 Window 的屏幕截图并查看其分辨率来衡量)?我能理解,由于 window header 栏,高度是否会有一点差异,但宽度和高度的这种差异对我来说没有意义。该文档没有暗示类似的事情。如果有人能开导一下,那就太好了!
这是一个用 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;
}
}
@张宗仁,感谢测试。我又试了一次,像你一样把它分成两个应用程序。 windows 的大小对我来说是完全不同的。我在我的两台显示器上都试过了 - 同样的事情。
顺便说一句,我用的是elementary OS 0.4.1 Loki,安装的libgtk-3-0版本是3.18.9.
从评论来看,您似乎已经检查过大小是否相同,但将其转化为实际答案。
让我们添加一个信号来通知我们 window 尺寸:
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) Width: 800 Height: 600
不过有一点不同,使用 Gtk.Widget.set_size_request
将不允许小部件小于给定的大小(因此 Gtk.Window
),而使用 Gtk.Window.set_default_size
将允许window 到 "shrink" 低于初始大小。
来自API:
-
Sets the default size of a window.
If the window’s “natural” size (its size request) is larger than the default, the default will be ignored. More generally, if the default size does not obey the geometry hints for the window ( set_geometry_hints can be used to set these explicitly), the default size will be clamped to the nearest permitted size.
Unlike set_size_request, which sets a size request for a widget and thus would keep users from shrinking the window, this function only sets the initial size, just as if the user had resized the window themselves. Users can still shrink the window again as they normally would. Setting a default size of -1 means to use the “natural” default size (the size request of the window).
-
Sets the minimum size of a widget; that is, the widget’s size request will be at least width by height.
You can use this function to force a widget to be larger than it normally would be.
In most cases, set_default_size is a better choice for toplevel windows than this function; setting the default size will still allow users to shrink the window. Setting the size request will force them to leave the window at least as large as the size request. When dealing with window sizes, set_geometry_hints can be a useful function as well.
Note the inherent danger of setting any fixed size - themes, translations into other languages, different fonts, and user action can all change the appropriate size for a given widget. So, it's basically impossible to hardcode a size that will always be correct.
The size request of a widget is the smallest size a widget can accept while still functioning well and drawing itself correctly. However in some strange cases a widget may be allocated less than its requested size, and in many cases a widget may be allocated more space than it requested. ... The size request set here does not include any margin from the Widget properties margin-left, margin-right, margin-top, and margin-bottom, but it does include pretty much all other padding or border properties set by any subclass of Widget.