2011-12-06 117 views
2

這是我迄今爲止GTK和滾動文本視圖

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; 

} 

我想作爲文本開始填充框中的文本視圖是滾動的,但框不斷擴大,以容納更多的文本。怎麼做我限制文本視圖的大小並創建一個可滾動的文本視圖。

在此先感謝:-)

回答

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

你體驗什麼是小工具,要求其父容器更多的空間的結果。 除非父容器有一些禁止擴展的規則,否則它會給孩子小部件所要求的那麼多空間。

避免這種情況的常用方法是爲子控件設置一個給定尺寸爲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()是爲了使窗口未調整大小由用戶(應用程序仍然可以調整它的大小),但是有窗口tighting到其子控件的大小的額外propertie。每個GtkContainer都有其設置擴展,緊密度等的方法。只有實驗才能找到適合您需求的方法。 如果窗口可調整大小的屬性設置爲TRUE,textarea仍然會有給定的大小,容器只會在GtkTable中的各個小部件之間留出很多額外的空間。