我们如何在 GTKmm 中添加 "Spacer"s?

How do we add "Spacer"s in GTKmm?

在 Qt 中,如果您希望单个布局中的小部件在物理上分开,您可以在它们之间添加一个间隔符,我们在 GTKmm 中有类似的东西吗?

这里的标签(Gtk::Label m_label;)和按钮(Gtk::Button m_open_button, m_delete_button;)在同一个盒子里(Gtk::HBox m_control_HBox;):

m_control_HBox.pack_start(m_label, Gtk::PACK_EXPAND_PADDING);
m_control_HBox.pack_start(m_open_button, Gtk::PACK_SHRINK);
m_control_HBox.pack_start(m_delete_button, Gtk::PACK_SHRINK);

我希望将标签进一步向左推,而按钮保留在原位。我该怎么做?

您是否尝试过使用其中一种 add_label 方法?它们允许您设置标签的对齐方式。

来自here

void add_label (const Glib::ustring& label, bool mnemonic=false, double x_align=0.5, double y_align=0.5)
    Add a Label object.

void add_label (const Glib::ustring& label, bool mnemonic, Align x_align, Align y_align=ALIGN_CENTER)
    Add a Label object.

目前,您的标签小部件的宽度已达到容纳文本所需的宽度,并且小部件在可用 space 中居中。 (标签两侧的 space 是 HBox 的一部分。)

-----------------------------------------------
|        | Label |        | Button || Button ||
-----------------------------------------------
 ^^^^^^^^         ^^^^^^^^
These spaces are the padding that was expanded, as requested.

要使文本一直显示在左侧,您需要更改该设置。我可以提供两种选择。

展开小部件并移动文本

让标签小部件填充可用的 space 可能有用(对于鼠标事件?),完全隐藏 HBox

-----------------------------------------------
|| Label                 || Button || Button ||
-----------------------------------------------

这可以通过将其包装从 Gtk::PACK_EXPAND_PADDING 更改为 Gtk::PACK_EXPAND_WIDGET 来实现。

不过,就其本身而言,此更改似乎没有任何作用,因为文本默认位于标签小部件的中心。因此,您还需要调用 set_xalign()。此函数的参数是一个从 0 到 1 的浮点值,其中 0 是最左边,1 是最右边。

您的代码如下所示。

m_label.set_xalign(0.0f);                                    // <-- set text alignment
m_control_HBox.pack_start(m_label, Gtk::PACK_EXPAND_WIDGET); // <-- change packing
m_control_HBox.pack_start(m_open_button, Gtk::PACK_SHRINK);
m_control_HBox.pack_start(m_delete_button, Gtk::PACK_SHRINK);

移动标签

另一种选择是保持标签小部件的宽度,但将其一直向左移动。

-----------------------------------------------
|| Label |                | Button || Button ||
-----------------------------------------------
          ^^^^^^^^^^^^^^^^
This space within the HBox has no widgets covering it.

首先,您要为标签提供与按钮相同的包装,Gtk::PACK_SHRINK。这里的技巧是让按钮保持在右边。这就是 pack_end() 函数的目的。从头开始包装标签,从最后开始包装按钮。

m_control_HBox.pack_start(m_label, Gtk::PACK_SHRINK);       // <-- Change packing
m_control_HBox.pack_end(m_open_button, Gtk::PACK_SHRINK);   // <-- pack_end
m_control_HBox.pack_end(m_delete_button, Gtk::PACK_SHRINK); // <-- pack_end