Gtk(mm)限制组合框的宽度

时间:2017-04-14 15:03:16

标签: gtk gtkmm

因为我使用的Combobox可能包含很长的文本条目, 导致组合框的宽度增加到超出合理的尺寸, 我试图给组合框提供最大宽度。

如果我这样做:

class MyCombo : public Gtk::ComboBox {
    private:
        CellRendererText render;
    public:
        MyCombo() {
            render.property_width_chars() = 10;
            render.property_ellipsize() = Pango::ELLIPSIZE_END;
            pack_start(render, true);
        }
};

结果将是一个所需宽度的空单元格,这似乎是合乎逻辑的,因为我没有指定要显示的列。但是我怎么能用这种尝试呢?使用pack_start只会绕过渲染器......

另一种方法就是这个:

class MyCombo : public Gtk::ComboBox {
    private:
        CellRendererText render;
    public:
        MyCombo() {
            pack_start(render, true);
            set_cell_data_func(render, sigc::mem_fun(*this, &MyCombo::render_iter));
        }

        void render_iter(const TreeModel::const_iterator& iter) {
            Glib::ustring data = get_string_from_iter(iter);
            int desired_width_chars = 10; //for example
            render.property_text() = ellipsize_string(data, desired_width_chars);
        }
};

使用这种方法,它可以工作,但弹出窗口中的文本(当你点击组合框时打开的东西)也缩短了,这不是我想要的(显然用户应该能够读取整个字符串而我不关心弹出窗口。)

你能帮我解决这个问题吗?我会很高兴任何建议/替代解决方案。

关心tagelicht

3 个答案:

答案 0 :(得分:1)

这可能是您正在寻找的:

cell_renderer_text.set_wrap_width(10) 

这适用于Python,但你明白了:-)

不幸的是,文档很少。我在Anjuta / Glade中找到了这个。

修改:

文档为here。它们并没有太大的帮助,但确实存在。

答案 1 :(得分:1)

注意: set_wrap_width是一个函数,用于在指定的列数上包装组合框中的条目总数;它没有回答这个问题。

Using set_wrap_width(1)

Using set_wrap_width(5)

按照Noup的回答作为指导,我设法得到以下代码;它直接回答了问题及其要求(C ++ / Gtkmm)。

// Get the first cell renderer of the ComboBox. 
auto v_cellRenderer = (Gtk::CellRendererText*)v_comboBox.get_first_cell();

// Probably obsolete:
v_cellRenderer->property_width_chars() = 1;

// Sets the ellipses ("...") to be at the end, where text overflows.
v_cellRenderer->property_ellipsize() = Pango::ELLIPSIZE_END;

// Sets the size of the box, change this to suit your needs. 
// -1 sets it to automatic.
v_cellRenderer->set_fixed_size(200, -1);

结果: Result of code

BE AWARE:取决于您执行上述代码的位置;要么所有单元格都是相同的大小,要么只是框本身(预期)。 通过实验,我发现:

  • 在父对象构造函数中:所有单元格大小都相同。
  • 在单独的函数中:只有第一个单元格(框)受到影响。

我建议您将代码放在一个与comboBox更改的信号相关的函数中,例如:

    v_comboBox.signal_changed().connect(sigc::mem_fun(*this, &YourClass::v_comboBox_changed));

答案 2 :(得分:0)

作为替代方案,以下内容适用于我,无需设置wrap_width或子类ComboBox(在Gtk#中):

ComboBoxText cb = new ComboBoxText();
cb.Hexpand = true; //If there's available space, we use it
CellRendererText renderer = (cb.Cells[0] as CellRendererText); //Get the ComboBoxText only renderer
renderer.WidthChars = 20; //Always show at least 20 chars
renderer.Ellipsize = Pango.EllipsizeMode.End;

注意:如果可用,我正在使用Expand来使用空间。如果您只想将组合框保持在固定宽度上,只需删除该位。