gpt4 book ai didi

c - 使用包裹在 GtkBox 中的 GtkTextView 自动滚动 GtkScrolledWindow

转载 作者:太空宇宙 更新时间:2023-11-04 02:52:51 26 4
gpt4 key购买 nike

当我在 GtkScrolledWindow 中有 GtkTextView 时,当用户在小部件底部追加新行时它会自动滚动。当我将 GtkTextView 放入 GtkBox 然后放入 GtkScrolledWindow 时,我无法工作。我需要在 GtkTextView 和滚动条之间放置一个框,如果不将整个内容放在另一个框中我就无法做到这一点。在 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 周围添加小部件,而无需 incomodate 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com