【问题标题】:Gtk 3.0 Text View ResizableGtk 3.0 文本视图可调整大小
【发布时间】:2020-04-05 07:22:41
【问题描述】:

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

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

代码:

#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`

【问题讨论】:

    标签: c gtk gtk3


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-15
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多