2010-05-09 4 views
4

J'ai un bouton qui, lorsqu'on clique dessus, copie et ajoute le texte d'un widget GtkEntry dans un widget GtkTextView. (Ce code est une version modifiée d'un exemple trouvé dans « Le texte Voir Widget » chapitre Fondations de GTK + Développement.)Insertion de nouvelles lignes dans un widget GtkTextView (programmation GTK +)

Je suis à la recherche d'insérer un saut de ligne avant que le texte qui obtient copié et ajouté , de sorte que chaque ligne de texte sera sur sa propre ligne dans le widget GtkTextView. Comment ferais-je cela? Je suis tout nouveau à GTK +.

est ici l'exemple de code:

#include <gtk/gtk.h> 

typedef struct 
{ 
    GtkWidget *entry, *textview; 
} Widgets; 

static void insert_text (GtkButton*, Widgets*); 

int main (int argc, 
      char *argv[]) 
{ 
    GtkWidget *window, *scrolled_win, *hbox, *vbox, *insert; 
    Widgets *w = g_slice_new (Widgets); 

    gtk_init (&argc, &argv); 

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_title (GTK_WINDOW (window), "Text Iterators"); 
    gtk_container_set_border_width (GTK_CONTAINER (window), 10); 
    gtk_widget_set_size_request (window, -1, 200); 

    w->textview = gtk_text_view_new(); 
    w->entry = gtk_entry_new(); 
    insert = gtk_button_new_with_label ("Insert Text"); 

    g_signal_connect (G_OBJECT (insert), "clicked", 
       G_CALLBACK (insert_text), 
       (gpointer) w); 

    scrolled_win = gtk_scrolled_window_new (NULL, NULL); 
    gtk_container_add (GTK_CONTAINER (scrolled_win), w->textview); 

    hbox = gtk_hbox_new (FALSE, 5); 
    gtk_box_pack_start_defaults (GTK_BOX (hbox), w->entry); 
    gtk_box_pack_start_defaults (GTK_BOX (hbox), insert); 

    vbox = gtk_vbox_new (FALSE, 5); 
    gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0); 
    gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); 

    gtk_container_add (GTK_CONTAINER (window), vbox); 
    gtk_widget_show_all (window); 

    gtk_main(); 
    return 0; 
} 

/* Insert the text from the GtkEntry into the GtkTextView. */ 
static void 
insert_text (GtkButton *button, 
      Widgets *w) 
{ 
    GtkTextBuffer *buffer; 
    GtkTextMark *mark; 
    GtkTextIter iter; 
    const gchar *text; 

    buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (w->textview)); 
    text = gtk_entry_get_text (GTK_ENTRY (w->entry)); 

    mark = gtk_text_buffer_get_insert (buffer); 
    gtk_text_buffer_get_iter_at_mark (buffer, &iter, mark); 
    gtk_text_buffer_insert (buffer, &iter, text, -1); 
} 

Vous pouvez compiler le code en utilisant la commande suivante (en supposant que le fichier est nommé file.c):

gcc file.c -o file `pkg-config --cflags --libs gtk+-2.0` 

Merci tout le monde!

Répondre

4

Peut-être que vous pouvez simplement insérer le caractère de nouvelle ligne de la même façon que vous insérez d'autres personnages:

... 
mark = gtk_text_buffer_get_insert (buffer); 
gtk_text_buffer_get_iter_at_mark (buffer, &iter, mark); 

/* Insert newline (only if there's already text in the buffer). */ 
if (gtk_text_buffer_get_char_count(buffer)) 
    gtk_text_buffer_insert (buffer, &iter, "\n", 1); 

gtk_text_buffer_insert (buffer, &iter, text, -1); 
... 

"\n" est une chaîne contenant le caractère de nouvelle ligne en C, et il fonctionne très bien dans GTK (à moins qu'il n » t dans Windows pour une raison étrange).

Blurb inutile: Le 1 peut tout aussi bien être -1 ici; il indique simplement à GTK qu'il n'a qu'à lire 1 caractère, ce qui peut être un peu plus rapide. Certes, cette ligne de code ne devrait presque jamais être un goulot d'étranglement :-)

Questions connexes