当我在GtkScrolledWindow中拥有GtkTextView时,当用户在小部件底部追加新行时,它会自动滚动。当我把GtkTextView放在GtkBox中,然后放在GtkScrolledWindow中时,我不工作。我需要将box放在GtkTextView和scrollbar之间,如果不将整个东西放在另一个box中,我就无法做到这一点。在GtkScrolledWindow中使用GtkBox时,是否有任何方法可以保持自动滚动行为?
有一些代码解决了我的问题:

#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;
}

最佳答案

问题是GtkTextView实现GtkScrollableGtkBox没有。这不是一个小问题:如果你想采用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;
}

关于c - 自动滚动带有包装在GtkBox中的GtkTextView的GtkScrolledWindow,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20406594/

10-11 23:01