Gtk (mm) 组合框的限制宽度
Gtk (mm) limit width of 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);
}
};
使用这种方法,它有效,但是弹出窗口中的文本(当你点击组合框时打开的内容)也被缩短了,这不是我想要的(显然用户应该能够阅读整个字符串并且我不关心弹出窗口的宽度。)
你能帮我解决这个问题吗?我会很高兴任何 advice/alternative 解决方案。
问候 tagelicht
这可能是您要找的:
cell_renderer_text.set_wrap_width(10)
这是给 Python 的,但你明白了:-)
不幸的是,文档很少。我通过在 Anjuta/Glade.
中搜索找到了这个
编辑:
文档是 here。它们并不过分有用,但它们确实存在。
作为替代方案,以下对我有用,而无需设置 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 来使用 space。如果您只想将组合框保持在固定宽度,只需删除该位即可。
注意: set_wrap_width
是一个函数,它将组合框中的条目总数包装在指定的多个列上;它没有回答问题。
使用 set_wrap_width(1) |使用 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; Sets character width to 1.
v_cellRenderer->property_width_chars() = 1;
// Sets the ellipses ("...") to be at the end, where text overflows.
// See Pango::ELLIPSIZE enum for other values.
v_cellRenderer->property_ellipsize() = Pango::ELLIPSIZE_END;
// Sets the size of the box, change this to suit your needs.
// -1 sets it to automatic scaling: (width, height).
v_cellRenderer->set_fixed_size(200, -1);
结果(图片):
Result of code
注意: 取决于您执行上述代码的位置;所有单元格的大小都相同,或者只是框本身(预期)。
通过实验,我发现:
- 在父对象构造函数中:所有单元格大小相同。
- 在单独的函数中:只有第一个单元格(框)受到影响。
我建议您将代码放在连接到组合框更改信号的函数中,例如:
v_comboBox.signal_changed().connect(sigc::mem_fun(*this, &YourClass::comboBox_changedFunction));
因为我使用的组合框可能包含非常长的文本条目, 这导致组合框的宽度增加到远远超出合理的大小, 我正在尝试为组合框提供最大宽度。
如果我这样做:
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);
}
};
使用这种方法,它有效,但是弹出窗口中的文本(当你点击组合框时打开的内容)也被缩短了,这不是我想要的(显然用户应该能够阅读整个字符串并且我不关心弹出窗口的宽度。)
你能帮我解决这个问题吗?我会很高兴任何 advice/alternative 解决方案。
问候 tagelicht
这可能是您要找的:
cell_renderer_text.set_wrap_width(10)
这是给 Python 的,但你明白了:-)
不幸的是,文档很少。我通过在 Anjuta/Glade.
中搜索找到了这个编辑:
文档是 here。它们并不过分有用,但它们确实存在。
作为替代方案,以下对我有用,而无需设置 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 来使用 space。如果您只想将组合框保持在固定宽度,只需删除该位即可。
注意: set_wrap_width
是一个函数,它将组合框中的条目总数包装在指定的多个列上;它没有回答问题。
使用 set_wrap_width(1) |使用 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; Sets character width to 1.
v_cellRenderer->property_width_chars() = 1;
// Sets the ellipses ("...") to be at the end, where text overflows.
// See Pango::ELLIPSIZE enum for other values.
v_cellRenderer->property_ellipsize() = Pango::ELLIPSIZE_END;
// Sets the size of the box, change this to suit your needs.
// -1 sets it to automatic scaling: (width, height).
v_cellRenderer->set_fixed_size(200, -1);
结果(图片): Result of code
注意: 取决于您执行上述代码的位置;所有单元格的大小都相同,或者只是框本身(预期)。 通过实验,我发现:
- 在父对象构造函数中:所有单元格大小相同。
- 在单独的函数中:只有第一个单元格(框)受到影响。
我建议您将代码放在连接到组合框更改信号的函数中,例如:
v_comboBox.signal_changed().connect(sigc::mem_fun(*this, &YourClass::comboBox_changedFunction));