包裹的 GtkLabel 巨大的高度
Wrapped GtkLabel huge height
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 认为小部件要求高度等于每个单词后的换行符。不,我不能手动缩小 window。如何恢复它的高度?
虽然我对 Gtk3 编程没有任何经验,但我在 Qt5 中看到了非常相似的现象。
我认为发生的情况是 Gtk3 会将标签的最小高度设置为包装到其最小宽度时的高度。我的意思是标签本身的最小宽度,所以即使 window 不能变小,如果 window.[=12= 旁边有一些其他小部件,标签也可能会变小]
这里描述了这个机制:https://developer.gnome.org/gtk3/stable/GtkWidget.html#geometry-management
特别注意:
The minimum height for the minimum width is normally used to set the
minimum size constraint on the toplevel (unless
gtk_window_set_geometry_hints() is explicitly used instead).
所以您可以尝试在标签本身上设置更大的最小宽度限制,看看是否有任何改变。
到目前为止对我来说最有效的解决方案 (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 docs suggest 使用 gtk_label_set_width_chars(GTK_LABEL(label), 30)
,但这只是减少了一点浪费的高度,并没有解决问题。因此,如果文本超过几行,您在使用 gtk_label_set_width_chars(GTK_LABEL(label), 30)
时仍然会浪费大量垂直 space。调用 gtk_window_set_default_size(GTK_WINDOW(win), x, -1);
对我没有任何影响。
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 认为小部件要求高度等于每个单词后的换行符。不,我不能手动缩小 window。如何恢复它的高度?
虽然我对 Gtk3 编程没有任何经验,但我在 Qt5 中看到了非常相似的现象。
我认为发生的情况是 Gtk3 会将标签的最小高度设置为包装到其最小宽度时的高度。我的意思是标签本身的最小宽度,所以即使 window 不能变小,如果 window.[=12= 旁边有一些其他小部件,标签也可能会变小]
这里描述了这个机制:https://developer.gnome.org/gtk3/stable/GtkWidget.html#geometry-management
特别注意:
The minimum height for the minimum width is normally used to set the minimum size constraint on the toplevel (unless gtk_window_set_geometry_hints() is explicitly used instead).
所以您可以尝试在标签本身上设置更大的最小宽度限制,看看是否有任何改变。
到目前为止对我来说最有效的解决方案 (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 docs suggest 使用 gtk_label_set_width_chars(GTK_LABEL(label), 30)
,但这只是减少了一点浪费的高度,并没有解决问题。因此,如果文本超过几行,您在使用 gtk_label_set_width_chars(GTK_LABEL(label), 30)
时仍然会浪费大量垂直 space。调用 gtk_window_set_default_size(GTK_WINDOW(win), x, -1);
对我没有任何影响。