首页 > 解决方案 > Gtk 3.0 文本视图可调整大小

问题描述

我正在尝试创建一个文本区域,以便我可以创建一个文本编辑器,但是当文本到达窗口的末尾时,它只会扩展并变得更大并且看起来很糟糕。

我在我的代码中尝试了多种方法来防止这种调整大小,但都没有奏效。具有滚动功能的窗口会更容易吗?(我只是想让我的代码简单)

代码:

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

static GtkTextBuffer *buffer;

void checkEndLine(GtkWidget *text, gpointer data){
    //g_print(":%d ", gtk_text_buffer_get_char_count(GTK_TEXT_BUFFER(buffer)));
}

static void activate (GtkApplication *app, gpointer user_data){

    GtkWidget *window, *grid, *calculate;

//Create Grid and Window
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "Menu Test");
    gtk_window_resize(GTK_WINDOW(window), 600, 600);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
    grid = gtk_grid_new();
    gtk_container_add(GTK_CONTAINER(window), grid);

//Text Field

    GtkWidget *largeEntry = gtk_text_view_new ();
    GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 1);

    gtk_widget_set_size_request(GTK_WIDGET(box), 100, 100);
    gtk_widget_set_size_request(GTK_WIDGET(largeEntry), 100, 100);
    gtk_widget_set_size_request(GTK_WIDGET(grid), 300, 300);

    gtk_box_pack_start(GTK_BOX(box), largeEntry, 1, 1, 1);  

    buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (largeEntry));
    gtk_text_buffer_set_text (buffer, "He", -1);


    gtk_grid_attach(GTK_GRID(grid), box, 0, 1, 1, 1);
    gtk_widget_set_hexpand_set(GTK_WIDGET(largeEntry), FALSE);

    g_signal_connect(GTK_TEXT_BUFFER(buffer), "changed", G_CALLBACK(checkEndLine), NULL);

//Showing widgets 
    gtk_widget_show_all(window);
    gtk_main();
}

int main(int argc, char **argv){
    GtkApplication *app;
    int status;

    app = gtk_application_new("com.calculate", G_APPLICATION_FLAGS_NONE);
    g_signal_connect(app, "activate", G_CALLBACK (activate), NULL);
    status = g_application_run (G_APPLICATION (app), argc, argv);
    g_object_unref(app);

    return status;
}

编译:

gcc note.c `pkg-config --cflags gtk+-3.0` -o out `pkg-config --libs gtk+-3.0`

标签: cgtkgtk3

解决方案


通过设置换行模式,您可以阻止文本展开窗口

gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(largeEntry), GTK_WRAP_WORD_CHAR);

但这只会阻止它水平扩展窗口。要阻止它垂直扩展窗口,您必须将文本视图放在滚动窗口中。

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

static GtkTextBuffer *buffer;

void checkEndLine(GtkWidget *text, gpointer data)
{
  //g_print(":%d ", gtk_text_buffer_get_char_count(GTK_TEXT_BUFFER(buffer)));
}

static void activate(GtkApplication *app, gpointer user_data)
{

  GtkWidget *window, *grid, *calculate;

  //Create Grid and Window
  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), "Menu Test");
  gtk_window_resize(GTK_WINDOW(window), 600, 600);
  g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
  gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
  grid = gtk_grid_new();
  gtk_container_add(GTK_CONTAINER(window), grid);

  //Text Field

  GtkWidget *largeEntry = gtk_text_view_new();
  GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 1);

  GtkWidget *swindow = gtk_scrolled_window_new(NULL, NULL);
  gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);

  gtk_container_add(GTK_CONTAINER(swindow), largeEntry);

  gtk_widget_set_size_request(GTK_WIDGET(swindow), 100, 100);
  gtk_widget_set_size_request(GTK_WIDGET(largeEntry), 100, 100);
  gtk_widget_set_size_request(GTK_WIDGET(grid), 300, 300);

  gtk_box_pack_start(GTK_BOX(box), largeEntry, 1, 1, 1);
  gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(largeEntry), GTK_WRAP_WORD_CHAR);
  buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(largeEntry));
  gtk_text_buffer_set_text(buffer, "He", -1);

  gtk_grid_attach(GTK_GRID(grid), swindow, 0, 1, 1, 1);
  gtk_widget_set_hexpand_set(GTK_WIDGET(largeEntry), FALSE);

  g_signal_connect(GTK_TEXT_BUFFER(buffer), "changed", G_CALLBACK(checkEndLine), NULL);

  //Showing widgets
  gtk_widget_show_all(window);
  gtk_main();
}

int main(int argc, char **argv)
{
  GtkApplication *app;
  int status;

  app = gtk_application_new("com.calculate", G_APPLICATION_FLAGS_NONE);
  g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
  status = g_application_run(G_APPLICATION(app), argc, argv);
  g_object_unref(app);

  return status;
}

推荐阅读