4

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

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;

}

我希望文本视图在文本开始填充框时可以滚动,但框会继续扩展以容纳更多文本。我如何限制文本视图的大小并创建一个可滚动的文本视图。

提前致谢 :-)

4

2 回答 2

13

恐怕您误解了滚动条在 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;
}
于 2011-12-07T10:42:38.817 回答
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 都有设置扩展、紧密度等的方法。只需进行实验即可找到适合您需求的方法。如果 window resizable 属性设置为 TRUE,textarea 仍将具有给定的大小,容器只会在 GtkTable 内的各个小部件之间放置大量额外空间。

于 2011-12-06T22:07:36.930 回答