GTK и прокрутка текста - PullRequest
       19

GTK и прокрутка текста

4 голосов
/ 06 декабря 2011

Это то, что я имею до сих пор

GtkWidget* createConsoleBox()
{
        GtkWidget* textArea = gtk_text_view_new();
        GtkWidget* scrollbar = gtk_vscrollbar_new(gtk_text_view_get_vadjustment(GTK_TEXT_VIEW(textArea)));
        GtkWidget* textEntry = gtk_entry_new();

        GtkWidget* console = gtk_table_new(3, 2, FALSE);

        gtk_table_attach_defaults(GTK_TABLE(console), textArea, 0, 1, 0, 1);
        gtk_table_attach_defaults(GTK_TABLE(console), scrollbar, 1, 2, 0, 1);

        gtk_table_attach_defaults(GTK_TABLE(console), textEntry, 0, 2, 1, 2);

        return console;

}

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

Заранее спасибо: -)

Ответы [ 2 ]

8 голосов
/ 07 декабря 2011

Боюсь, вы неправильно поняли, как работают полосы прокрутки в GTK; обычно вы не создаете полосу прокрутки напрямую, но помещаете виджет, который хотите прокрутить, в GtkScrolledWindow. Это автоматически создает полосы прокрутки и соединяет их с виджетом внутри прокручиваемого окна; в вашем случае текстовое представление.

Вот как должна выглядеть ваша createConsoleBox() функция:

GtkWidget* createConsoleBox()
{
    GtkWidget* textArea = gtk_text_view_new();
    GtkWidget* scrolledwindow = gtk_scrolled_window_new(NULL, NULL);
    GtkWidget* textEntry = gtk_entry_new();
    GtkWidget* console = gtk_table_new(3, 1, FALSE);

    gtk_container_add(GTK_CONTAINER(scrolledwindow), textArea);
    gtk_table_attach_defaults(GTK_TABLE(console), scrolledwindow, 0, 1, 0, 1);
    gtk_table_attach_defaults(GTK_TABLE(console), textEntry, 0, 1, 1, 2);

    return console;
}
1 голос
/ 07 декабря 2011

То, что вы испытываете, является результатом того, что виджет запрашивает больше места в родительском контейнере.Если родительский контейнер не имеет каких-либо правил, запрещающих расширение, он даст столько места, сколько требует дочерний виджет.

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

В этом примере кода показан один из способов сделать это.

#include <gtk/gtk.h>

GtkWidget* createConsoleBox()
{
    GtkWidget* textArea = gtk_text_view_new();
    GtkWidget* scrollbar= gtk_vscrollbar_new(gtk_text_view_get_vadjustment(GTK_TEXT_VIEW(textArea)));
    GtkWidget* textEntry = gtk_entry_new();

    GtkWidget* console = gtk_table_new(3, 2, FALSE);

    gtk_table_attach_defaults(GTK_TABLE(console), textArea, 0, 1, 0, 1);
    gtk_table_attach_defaults(GTK_TABLE(console), scrollbar, 1, 2, 0, 1);
    gtk_table_attach_defaults(GTK_TABLE(console), textEntry, 0, 2, 1, 2);
    //This code sets the preferred size for the widget, so it does not ask for extra space
    gtk_widget_set_size_request(textArea, 320, 240);

    return console;
}


int main(int argc,char* argv[]){
    GtkWidget *window;
    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "Simple Sample");
    gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);// does not  matter this size
    gtk_container_add(GTK_CONTAINER(window), createConsoleBox());
    gtk_widget_show_all(window);
    gtk_window_set_resizable(GTK_WINDOW(window),FALSE);//because of this
    gtk_main();
    return 0;
}

gtk_window_set_resizable()сделать окно недоступным для изменения размера пользователем (приложение все еще может изменить его размер), но имеет дополнительную возможность подгонять окно к размеру его дочернего виджета.Каждый GtkContainer имеет свой способ настройки расширения, плотности и т. Д. Это только вопрос экспериментов, чтобы найти правильный для ваших нужд.Если бы свойство изменяемого размера окна было установлено в значение ИСТИНА, текстовое поле все равно имело бы заданный размер, контейнер просто поместил бы много дополнительного пространства между отдельными виджетами внутри GtkTable.

...