2010-04-21 2 views
0

GtkVBox 및 GtkViewPort로 하나의 목록을 만들었습니다.
그리고 나는 두 개의 위/아래 GtkButtons에 의한 스크롤을하고있다. 나는 중 VBOX에 위젯을 추가 할 때 내가 gtk_box_pack_start을 사용하고 같은Gtk, 뷰포트 목록 맨 아래로 스크롤하는 방법은 무엇입니까?

GtkAdjustment* adjustment; 
    adjustment = gtk_viewport_get_vadjustment(GTK_VIEWPORT(viewport_ptr)); 
    gtk_adjustment_set_value(adjustment, gtk_adjustment_get_value(adjustment)+(gdouble)SCROLL_SIZE); 
    gtk_widget_show_all(viewport_ptr); 

그러나이 중 VBOX의 끝에 추가됩니다. 그래서 목록의 맨 아래에있는 새로 추가 된 마지막 위젯까지 뷰포트를 스크롤하고 싶습니다. 상한이 스크롤 중 VBOX로 변경 때문에 당신이 지연이 필요하거나 적절한 이벤트에서 트리거 할 수

gtk_adjustment_set_value(adjustment, gtk_adjustment_get_upper(adjustment)); 

참고 :

+0

주위에 추가 작업 ... 업데이트 타이머 조정에 대한 조정은 1 초 타이머를 설정합니다. – User7723337

답변

1

방금 ​​최대 값으로 조정을 설정하려고 했나 자랍니다.

내 제안은 GtkVBox의 size-allocate 신호에 연결하는 것이 좋습니다.

+0

그것은 일했다, 그것은 VBox의 끝까지 스크롤하고 내가보기 포트의지도 이벤트에서 이것을하고 있어요. 하지만 문제는 내가 VBox에 위젯을 추가 할 때 마지막 위젯으로 스크롤하지 않는다는 것입니다. 두 번째 마지막 위젯까지 스크롤합니다. 나는 무엇을 놓치고 있니? – User7723337

+0

@PP : 스크롤 영역에서 자식 (vbox)이 성장했다는 것을 알기 전에 스크롤을 너무 빨리하고 있습니다. 그리고 수직 조정의 상한선을 업데이트했습니다. – unwind

+0

VBox에 위젯을 추가하고 뷰 포트에 'gtk_widget_show'를 추가 한 후이 작업을 수행하고 있습니다. 내가 어디에서해야합니까. 지연이나 무언가 또는 하나의 사건을 넣어야합니까? – User7723337

1

he suggests 신호를 size-allocate 신호에 연결했을 때의 의미는 다음과 같습니다 : @unwind

/*** 
This basic example program shows how to (automatically) move the 
scrollbar of a GTK+ text view to the very bottom after text has been added. 

Public domain code by N.L.M. de Jonge. 

gcc `pkg-config gtk+-3.0 --cflags` -O2 -std=c99 -g -pedantic -Wall \ 
-Wextra -Wshadow -Wpointer-arith -Wcast-qual -Wstrict-prototypes \ 
-Wmissing-prototypes -D_REENTRANT example.c -o example `pkg-config \ 
gtk+-3.0 --libs` 
***/ 

#include <gtk/gtk.h> 
#include <stdlib.h> 

GtkAdjustment *adj; 
GtkWidget *scroll; 
GtkTextBuffer *buffer; 
GtkTextIter iter; 
int iCounter; 

void ScrollToEnd (GtkWidget *widget, GdkRectangle *allocation); 
void Add (GtkButton *button); 

/*****************************************************************************/ 
void ScrollToEnd (GtkWidget *widget, GdkRectangle *allocation) 
/*****************************************************************************/ 
{ 
    if (widget != NULL) { } 
    if (allocation != NULL) { } 

    adj = gtk_scrolled_window_get_vadjustment 
     (GTK_SCROLLED_WINDOW (scroll)); 
    gtk_adjustment_set_value (adj, gtk_adjustment_get_upper (adj)); 
} 
/*****************************************************************************/ 
void Add (GtkButton *button) 
/*****************************************************************************/ 
{ 
    char sText[10]; 

    if (button != NULL) { } 

    iCounter++; 
    snprintf (sText, 10, "\n%i", iCounter); 
    gtk_text_buffer_get_end_iter (buffer, &iter); 
    gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, 
     g_locale_to_utf8 (sText, -1, NULL, NULL, NULL), -1, "red_fg", NULL); 

    /*** We just added text, but we do NOT call ScrollToEnd() here. ***/ 
} 
/*****************************************************************************/ 
int main (int argc, char *argv[]) 
/*****************************************************************************/ 
{ 
    GtkWidget *window, *box, *grid, *text, *button; 

    gtk_init (&argc, &argv); 

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
    g_signal_connect (window, "delete_event", 
     G_CALLBACK (exit), NULL); 
    gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER); 
    gtk_window_set_resizable (GTK_WINDOW (window), TRUE); 
    gtk_widget_realize (window); 

    box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); 
    gtk_container_add (GTK_CONTAINER (window), box); 
    gtk_widget_show (box); 

    grid = gtk_grid_new(); 
    gtk_widget_show (grid); 
    gtk_box_pack_start (GTK_BOX (box), grid, TRUE, TRUE, 0); 

    scroll = gtk_scrolled_window_new (NULL, NULL); 
    gtk_widget_set_size_request (scroll, 200, 200); 
    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), 
     GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); 
    /***/ 
    /*** We call ScrollToEnd() if scroll receives the size-allocate signal. ***/ 
    /***/ 
    g_signal_connect (scroll, "size-allocate", G_CALLBACK (ScrollToEnd), NULL); 
    gtk_grid_attach (GTK_GRID (grid), scroll, 0, 0, 1, 1); 
    g_object_set (scroll, "vexpand", TRUE, NULL); 
    g_object_set (scroll, "margin", 10, NULL); 
    gtk_widget_show (scroll); 

    text = gtk_text_view_new(); 
    gtk_container_add (GTK_CONTAINER (scroll), text); 
    gtk_widget_show (text); 

    buffer = gtk_text_buffer_new (NULL); 
    gtk_text_buffer_create_tag (buffer, "red_fg", "foreground", "red", NULL); 
    gtk_text_view_set_buffer (GTK_TEXT_VIEW (text), buffer); 

    button = gtk_button_new_with_label ("Add"); 
    g_signal_connect (button, "clicked", G_CALLBACK (Add), NULL); 
    gtk_grid_attach (GTK_GRID (grid), button, 0, 1, 1, 1); 
    g_object_set (button, "hexpand", TRUE, NULL); 
    gtk_widget_show (button); 

    gtk_widget_show (window); 

    iCounter = 0; 
    gtk_text_buffer_get_end_iter (buffer, &iter); 
    gtk_text_buffer_insert (buffer, &iter, g_locale_to_utf8 
     ("Click \"Add\" to add numbers.", -1, NULL, NULL, NULL), -1); 

    gtk_main(); 

    return 0; 
} 
/*****************************************************************************/ 

보너스로 컬러 텍스트를 추가하는 방법을 보여줍니다.

관련 문제