Как мы добавляем "Spacer" в GTKmm? - PullRequest
2 голосов
/ 08 июля 2019

В Qt, если вы хотите, чтобы виджеты в одном макете были физически разделены, вы добавляете пробел между ними, есть ли у нас что-то подобное в GTKmm?
enter image description here

Здесь метка (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);

Я бы хотел, чтобы метка была перемещена дальше влево, пока кнопки остаются на своем месте. Как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 27 июля 2019

В настоящее время у вас есть виджет метки настолько широкий, насколько это необходимо для размещения текста, и виджет центрируется в доступном пространстве. (Пробелы по сторонам этикетки являются частью HBox.)

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

Чтобы текст проходил влево, вам нужно изменить эту настройку. Я могу предоставить два варианта.

Разверните виджет и переместите текст

Может быть полезно (для событий мыши?), Чтобы виджет метки заполнил доступное пространство, полностью скрывая 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
0 голосов
/ 09 июля 2019

Вы пытались использовать один из методов add_label?Они позволяют вам установить выравнивание вашей метки.

С здесь :

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.
...