Linux GTK和x2B中的收缩窗口;当内容缩小时动态调整?

Linux GTK和x2B中的收缩窗口;当内容缩小时动态调整?,linux,gtk,vala,Linux,Gtk,Vala,我在Vala应用程序中有一个窗口,里面有一个图像。 该图像有时会被img.set\u从\u pixbuf(imgdata)更改因此它的大小也会改变。它嵌在一个Gtk盒子里 box = new Gtk.Box(Orientation.VERTICAL,5); ... box.pack_end(img,false,false); 因此,如果以前有一个大图像,我用一个较小的图像替换它,窗口仍然大得离谱,我还没有找到一种方法来动态地将其缩小到所需的空间。 我试过使用窗口。设置默认大小(box.widt

我在Vala应用程序中有一个窗口,里面有一个图像。 该图像有时会被
img.set\u从\u pixbuf(imgdata)更改因此它的大小也会改变。它嵌在一个Gtk盒子里

box = new Gtk.Box(Orientation.VERTICAL,5);
...
box.pack_end(img,false,false);
因此,如果以前有一个大图像,我用一个较小的图像替换它,窗口仍然大得离谱,我还没有找到一种方法来动态地将其缩小到所需的空间。 我试过使用
窗口。设置默认大小(box.width\u请求,box.height\u请求)
但它总是返回-1

那么,你知道如何调整窗口的大小吗?
谢谢

如果我没有弄错的话,只有当元素太大而无法绘制时,才会自动调整窗口大小。此外,set_default_size方法仅在首次绘制窗口时起作用,除非我错了,否则将不再使用。我建议使用resize方法来设置窗口大小。()


使用resize时需要记住的一点是,如果无法将其调整到小于请求大小的大小,如果遇到该问题,请使用set\u request\u size方法。

我自己也曾处理过这个问题,虽然接受的答案是正确的,但我认为我可以给出一个更“完整”的答案,并使用有效的代码

重现问题

下面的代码(C++中,对不起)复制了您的问题:

#包括

奇怪,我知道

解决方案 要解决此问题,需要调用
resize
方法。因此,
切换
处理程序将变成:

void OnToggle()
{
如果(m_currentImageIndex==0)
{
m_currentImageIndex=1;
}
其他的
{
m_currentImageIndex=0;
}
Gtk::Widget*child=m_布局。在(0,0)处获取_child_;
Gtk::Image*currentImage=dynamic_cast(子级);
currentImage->set(m_文件[m_currentImageIndex]);
//调整窗口大小:
调整大小(1,1);
}

请注意,
resize
是使用尺寸1x1(可能的最小尺寸)调用的。Gtkmm将根据几何约束自动调整窗口的大小。

这里有几个输入错误:实际的方法名称/签名(在绑定中应该是等效的)是
get\u size\u request(out width,out height)
set\u size\u request(width,height)
。此外,
get\u size\u request
仅对其请求已明确设置的维度有意义;否则它们是-1。如果没有提出明确的请求,但用户仍然希望小部件有一个合适的大小,他们应该使用
get\u preferred\u height/\u width/\u size
。这将允许调整窗口的大小,使其小于首选的尺寸(例如,如果它是可滚动的,这将非常有用)。链接已断开。这是一个真正的问题。我经常遇到这种情况(例如,从
Gtk::ListBox
中删除的项目会使窗口变大)。
window.resize(box.width_request, box.height_request);