GTK和滚动文本视图

时间:2011-12-06 16:59:12

标签: c gtk2

这是我到目前为止所拥有的

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 个答案:

答案 0 :(得分:8)

我担心你误解了滚动条在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 :(得分:1)

您遇到的是小部件向其父容器请求更多空间的结果。 除非父容器有一些禁止扩展的规则,否则它将提供与子窗口小部件一样多的空间。

避免这种情况的常用方法是使用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都有它设置扩展,紧密等方式。只需要实验就可以找到适合您需求的产品。 如果窗口可调整大小属性已设置为TRUE,则textarea仍然具有给定的大小,容器将在GtkTable中的各个小部件之间放置大量额外空间。