我的问题代码,把text设置了换行模式,并且加入到一个滚动窗口里,滚动窗口的水平滚动策略是从不,垂直是自动滚动。
gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(g_memNoteTextView), GTK_WRAP_WORD_CHAR);
GtkWidget *scrolledWindow = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledWindow),GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
...这导致了当我输入文本超过行大小,文本不会换行,而且整个界面没有动态反应,像卡住一样。
但是我设置水平滚动策略成自动滚动后,就可以自动换行了,表现得正常。
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledWindow),GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);问了deepseek ai。他解释的不知道对不对,感觉他有点瞎说。我保留了看似何理的部分:
这个问题涉及到 GTK+ 中文本视图(GtkTextView)、滚动窗口(GtkScrolledWindow)和自动换行(wrap mode)之间的交互行为。让我解释一下为什么设置水平滚动策略为 GTK_POLICY_NEVER 会导致文本不能自动换行:
自动换行的基本原理:
- 当你在
GtkTextView上设置gtk_text_view_set_wrap_mode(GTK_WRAP_WORD_CHAR)时,文本视图确实有自动换行的能力 - 但是,实际是否换行还取决于文本视图可用的宽度
- 当你在
滚动窗口的作用:
GtkScrolledWindow本质上是一个视口(viewport),它控制着子部件可见区域的大小- 当水平滚动策略设置为
GTK_POLICY_NEVER时,滚动窗口会强制文本视图适应水平方向的所有内容,不会提供水平滚动条 - 这导致文本视图认为自己有无限的宽度可用,因此不会触发换行
总之,GTK_POLICY_NEVER 的行为是设计如此 - 它强制内容适应可用空间,而文本视图在这种情况下会认为自己有无限宽度可用,因此不会换行。