auto widget=gtk_label_new(text);
m_handle=GTK_LABEL(widget);
gtk_label_set_line_wrap(m_handle,TRUE);
gtk_label_set_max_width_chars(m_handle,80);
gtk_widget_set_size_request(GTK_WIDGET(m_handle),-1,1);
并且,标签包装但GTK认为小部件需要高度等于每个单词后的换行符。不,我不能手动缩小窗口。如何恢复它的高度?
答案 0 :(得分:4)
虽然我对Gtk3编程没有任何经验,但我在Qt5中看到了一个非常类似的现象。
我认为发生的事情是Gtk3会将标签的最小高度设置为包裹到最小宽度时的高度。我的意思是标签本身的最小宽度,所以即使窗口不能缩小,标签也可能,如果窗口旁边有一些其他小部件。
此处描述了此机制:https://developer.gnome.org/gtk3/stable/GtkWidget.html#geometry-management
特别注意:
最小宽度的最小高度通常用于设置 顶部的最小尺寸约束(除非 改为明确使用gtk_window_set_geometry_hints()。
因此,您可以尝试在标签本身上设置更大的最小宽度约束,并查看是否会发生任何变化。
答案 1 :(得分:1)
到目前为止,最适合我的解决方案(gtkmm):
class MultiLineLabel : public Gtk::Label {
public:
MultiLineLabel() : Gtk::Label() {
#if GTKMM_MAJOR_VERSION >= 3
set_line_wrap();
#endif
}
void set_markup(const Glib::ustring& s) {
Gtk::Label::set_markup(s);
m_markup = s;
}
void get_preferred_height_for_width_vfunc(int width, int& minimum_height, int& natural_height) const {
Gtk::Label::get_preferred_height_for_width_vfunc(width, minimum_height, natural_height);
Pango::Layout* origLayout = const_cast<Pango::Layout*>(get_layout().operator->());
Glib::RefPtr<Pango::Layout> layout = origLayout->copy();
Glib::ustring s = (!m_markup.empty()) ? m_markup : get_text();
layout->set_markup(s);
int w, h;
layout->get_pixel_size(w, h);
h += get_margin_top() + get_margin_bottom();
minimum_height = h;
if (natural_height < h)
natural_height = h;
}
private:
Glib::ustring m_markup;
};
此解决方案将覆盖get_preferred_height_for_width_vfunc()
,并使用标签的当前布局设置和当前文本(或标记)来计算在屏幕上呈现文本所需的确切宽度和高度。
到目前为止,我在网上发现的其他建议对我没有用。例如使用gtk_label_set_width_chars(GTK_LABEL(label), 30)
的{{3}},但这只是减少了浪费的高度,它不能解决问题。因此,如果文本超过了几行,使用gtk_label_set_width_chars(GTK_LABEL(label), 30)
时您仍然会浪费大量垂直空间。致电gtk_window_set_default_size(GTK_WINDOW(win), x, -1);
对我没有任何影响。