当我在GtkTextView中使用GtkScrolledWindow时,当用户在小部件底部添加新行时,它会自动滚动。当我将GtkTextView放在GtkBox中,然后在GtkScrolledWindow中时,我就不工作了。我需要把盒子放在GtkTextView和滚动条之间,如果不把整个东西放在另一个盒子里,我就不能这样做。在使用GtkBox在GtkScrolledWindow中时,是否有任何方法来保持自动滚动行为?
有一些代码可以稀释我的问题:
#include <gtk/gtk.h>
int main(int argc, char *argv[]) {
GtkWidget *window;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(window),
gdk_screen_width()*0.5, gdk_screen_height()*0.5);
GtkWidget *main = gtk_box_new(0, 0);
gtk_container_add(GTK_CONTAINER(window), main);
/*/////////////////////////////////////////////////*/
/* IMPORTANT PART */
/* FIRST CASE (this one works correctly) */
GtkWidget *scrolled_window_first = gtk_scrolled_window_new(NULL, NULL);
GtkWidget *text_view_first = gtk_text_view_new();
gtk_container_add(GTK_CONTAINER(scrolled_window_first), text_view_first);
gtk_box_pack_start(GTK_BOX(main), scrolled_window_first, 1, 1, 0);
/* SECOND CASE (there is no auto scroll which I need) */
GtkWidget *scrolled_window_second = gtk_scrolled_window_new(NULL, NULL);
GtkWidget *text_view_second = gtk_text_view_new();
GtkWidget *box_from_second_example = gtk_box_new(0, 0);
GtkWidget *example_box_before_scroller = gtk_box_new(0,0);
GtkWidget *example_label = gtk_label_new("I need this box badly!");
gtk_box_pack_start(GTK_BOX(box_from_second_example), text_view_second, 1, 1, 0);
gtk_container_add(GTK_CONTAINER(scrolled_window_second), box_from_second_example);
gtk_container_add(GTK_CONTAINER(box_from_second_example), example_box_before_scroller);
gtk_box_pack_start(GTK_BOX(main), scrolled_window_second, 1, 1, 0);
/* END IMPORTANT PART */
/*/////////////////////////////////////////////////*/
gtk_container_add(GTK_CONTAINER(example_box_before_scroller), example_label);
g_signal_connect(GTK_WINDOW(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(window);
gtk_main ();
return 0;
}发布于 2013-12-12 13:23:44
问题是GtkTextView实现了GtkScrollable,但GtkBox没有实现。这不是一个小问题:如果你想走GtkBox的道路,你应该把它放在一个GtkViewport中,并添加滚动的东西.相当多的代码涉及到对整个滚动过程的深入理解。
无论如何,如果您足够懒惰,您也可以注意到GtkTextview是一个GtkContainer。换句话说,您可以在GtkTextview周围添加小部件,而不需要更改GtkBox。不完全是你想要的,但也许对你的目的来说已经足够了:
#include <gtk/gtk.h>
gint main(gint argc, gchar **argv)
{
GtkWidget *window, *scrolled_window, *text_view, *label;
gtk_init(&argc, &argv);
text_view = gtk_text_view_new();
gtk_text_buffer_set_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view)),
"1\n\n\n2\n\n\n3\n\n\n4\n\n\n5\n\n\n6\n\n\n7\n\n\n8", -1);
/* Use this to set the size you want to reserve on the right */
gtk_text_view_set_border_window_size(GTK_TEXT_VIEW(text_view),
GTK_TEXT_WINDOW_RIGHT,
130);
/* Add whatever you want instead of a GtkLabel */
gtk_text_view_add_child_in_window(GTK_TEXT_VIEW(text_view),
gtk_label_new("You badly need this"),
GTK_TEXT_WINDOW_RIGHT,
0, 0);
scrolled_window = gtk_scrolled_window_new(NULL, NULL);
gtk_container_add(GTK_CONTAINER(scrolled_window), text_view);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(window), 320, 240);
gtk_container_add(GTK_CONTAINER(window), scrolled_window);
gtk_widget_show_all(window);
gtk_main ();
return 0;
} 发布于 2013-12-09 23:16:42
默认情况下,您是否尝试修改文本视图创建的GtkAdjustment (GtkScrolledWindow实现GtkScrollable afaik)。
GtkAdjustment * gtk_scrollable_get_hadjustment (GtkScrollable *scrollable);我认为最好的方法是检测到GtkTextBuffer的插入(通过
GtkTextBuffer * gtk_text_view_get_buffer (GtkTextView *text_view);并将回调(用于测试\n)挂接到其insert-text g_signal并使用
void gtk_adjustment_set_value (GtkAdjustment *adjustment,
gdouble value);若要修改滚动高度,请执行以下操作。
请注意,这是未经测试的,一个更简单的方法可能即将到来。
https://stackoverflow.com/questions/20406594
复制相似问题