我在Vala应用程序中有一个窗口,里面有一个图像。
此图片有时会被img.set_from_pixbuf(imgdata);
更改,因此其大小也会发生变化。它嵌入在Gtk.Box中。
box = new Gtk.Box(Orientation.VERTICAL,5);
...
box.pack_end(img,false,false);
因此,如果之前有一个大图像并且我用一个较小的图像替换它,那么窗口仍然非常大,我还没有找到一种方法将它动态缩小到所需的空间。
我试过window.set_default_size(box.width_request,box.height_request)
,但它总是返回-1。
那么任何想法如何调整窗口大小? 谢谢!
答案 0 :(得分:4)
如果我没有弄错的话,只有当元素太大而无法绘制时,才会自动调整窗口大小。另外,set_default_size方法仅在第一次绘制窗口时很重要,除非我错了,否则永远不会再使用。我建议使用resize方法来设置窗口大小。 (link)
window.resize(box.width_request, box.height_request);
使用调整大小时需要记住的一件事,如果遇到问题时无法调整大小,请使用set_request_size方法。
答案 1 :(得分:1)
我自己为这个问题而奋斗,虽然可接受的答案是正确的,但我可以通过工作代码给出更“完整”的答案。
以下代码(在C ++中,对不起)重现您的问题:
#include <array>
#include <gtkmm.h>
class ResizableWindow : public Gtk::Window
{
public:
ResizableWindow()
: m_toggle{"Toggle"}
, m_currentImageIndex{0}
{
m_files[0] = "small.png";
m_files[1] = "large.png";
// Setup window layout:
m_layout.attach(*Gtk::manage(new Gtk::Image(m_files[m_currentImageIndex])), 0, 0, 1, 1);
m_layout.attach(m_toggle, 0, 1, 1, 1);
add(m_layout);
// Set up signal handlers:
m_toggle.signal_clicked().connect([this](){OnToggle();});
}
private:
void OnToggle()
{
// Switch image file:
if(m_currentImageIndex == 0)
{
m_currentImageIndex = 1;
}
else
{
m_currentImageIndex = 0;
}
// Load new image.
Gtk::Widget* child = m_layout.get_child_at(0, 0);
Gtk::Image* currentImage = dynamic_cast<Gtk::Image*>(child);
currentImage->set(m_files[m_currentImageIndex]);
}
Gtk::Grid m_layout;
Gtk::Button m_toggle;
std::array<std::string, 2> m_files;
size_t m_currentImageIndex;
};
int main (int argc, char* argv[])
{
auto app = Gtk::Application::create(argc, argv, "so.question.q8903140");
ResizableWindow w;
w.show_all();
return app->run(w);
}
Toggle
按钮更改基础图像。两者都是同一张图片,但大小不同。请注意,正如您已经提到的,第一次切换时(小->大),窗口会适当调整大小。但是,当第二次切换(大->小)时,将调整图像的大小,而不是调整窗口大小,从而在图像周围留出额外的空间:
很奇怪,我知道...
要解决此问题,需要调用resize
方法。因此Toggle
处理程序将变为:
void OnToggle()
{
if(m_currentImageIndex == 0)
{
m_currentImageIndex = 1;
}
else
{
m_currentImageIndex = 0;
}
Gtk::Widget* child = m_layout.get_child_at(0, 0);
Gtk::Image* currentImage = dynamic_cast<Gtk::Image*>(child);
currentImage->set(m_files[m_currentImageIndex]);
// Resize window:
resize(1, 1);
}
请注意,resize
的尺寸为1x1(最小尺寸)。 Gtkmm将从那里自动根据几何约束调整窗口的大小。
答案 2 :(得分:-1)
对此并不太深入,只是采取了刺激 - 确实在呼唤:
box.set_resize_mode(RESIZE_IMMEDIATE);
box.check_resize();
做正确的事吗?