GTK +: проблема с выравниванием макета - PullRequest
1 голос
/ 22 ноября 2011

У меня есть простая проблема, которую трудно описать.

Мое окно GTK + выглядит следующим образом:

Представьте, что оно состоит из 3 компонентов: 2 панели инструментов кнопок и одна область рисования.

Слева у меня вертикальная панель инструментов с кнопками, справа - область рисования (большая), а под ней - горизонтальная панель инструментов с кнопками.

Япытаясь сделать так, чтобы левая вертикальная панель инструментов была точно посередине области рисования, а горизонтальная - ниже области рисования, но первая кнопка должна начинаться именно там, где начинается область рисования.

Я могу получитьодин (любое из моих условий), но не оба!

Могу ли я выровнять свои компоненты так, как я собираюсь, пожалуйста?

Я создаю vbox для вертикальной панели инструментов, где япоставить кнопки.У меня есть еще один вертикальный компонент с областью рисования и горизонтальной панелью инструментов (это его собственный hbox).После этого я создаю выравнивание по центру и помещаю в него вертикальную панель инструментов с кнопками.Наконец, я собрал эти два элемента в hbox.

В результате горизонтальная полоса находится ниже области рисования в правильном месте, а вертикальная полоса слева - в центре обеихобласть рисования и горизонтальная полоса (а не только горизонтальная область).

Я помещаю код ниже, но, надеюсь, его не так сложно прочитать:

    GtkWidget *infoBox = gtk_vbox_new(FALSE, 10);
    GtkWidget *drawingArea = gtk_drawing_area_new();

    GtkWidget *toolBar = gtk_vbox_new(FALSE, 10);
    /* Put the buttons (vertical bar on the left) */

    GtkWidget *deviceButtons = gtk_hbox_new(FALSE, 5);
    /* Put the buttons (horizontal bar below the drawing area) */

    GtkWidget *verticalView = gtk_vbox_new(FALSE, 10);

    GtkWidget *centerAlignment = gtk_alignment_new(0, 0.5, 0, 0);
    gtk_container_add(GTK_CONTAINER(centerAlignment), toolBar);

    GtkWidget *actionView = gtk_hbox_new(FALSE, 15);
    gtk_box_pack_start(GTK_BOX(actionView), centerAlignment, FALSE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(verticalView), drawingArea, FALSE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(verticalView), deviceButtons, FALSE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(actionView), verticalView, FALSE, FALSE, 0);
    GtkWidget *deviceView = gtk_vbox_new(FALSE, 10);
    gtk_box_pack_start(GTK_BOX(deviceView), actionView, FALSE, FALSE, 0);

    gtk_box_pack_start(GTK_BOX(infoBox), deviceView, FALSE, FALSE, 0);

    gtk_container_add(GTK_CONTAINER(deviceWindow), infoBox);

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

Спасибоочень много.

Ответы [ 2 ]

2 голосов
/ 22 ноября 2011

Как сказал Йоханнес, для этого вы должны использовать таблицу GtkTable.Проблема заключается в том, что пространство в нижнем левом углу всегда будет учитываться при вычислении размера, независимо от того, находится ли оно в HBox или VBox.Поэтому ни одна из ваших панелей инструментов не должна находиться в контейнере, который там расширяется.

См. Этот рисунок: Widgets placement

Красная зона не может быть назначена ни одной из ваших панелей инструментов, иначе она не будетвыровняться так, как вы хотите.Выравнивания не помогут вам здесь, я думаю.Поэтому единственное решение, которое я вижу, это использование GtkTable.Кроме того, в GTK3 GtkHBox и GtkVBox устарели, а также GtkTable и заменены на GtkGrid, который работает более или менее подобно GtkTable.

2 голосов
/ 22 ноября 2011

Вы можете использовать таблицу 2x2 GtkTable и оставить нижнюю левую ячейку пустой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...