包裹GtkLabel巨大的高度

时间:2017-05-16 14:51:08

标签: gtk3

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认为小部件需要高度等于每个单词后的换行符。不,我不能手动缩小窗口。如何恢复它的高度?

A huge window

2 个答案:

答案 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);对我没有任何影响。