IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec C & C++ Discussion :

Insertion scrollbar dans onglet -> viewText


Sujet :

GTK+ avec C & C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 54
    Points : 32
    Points
    32
    Par défaut Insertion scrollbar dans onglet -> viewText
    Salut à tous,
    je travaille actuelement sur un projet, et je voudrais insérer dans l'interface graphique une page à onglet avec à l'intérieur, une viewText accompagné d'une scrollbar.

    Voici une partie de mon code (désossé) sans scrollbar :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    void creerOnglet(GtkWidget *titre_onglet,gpointer pNotebook);
    int buttonPseudo(GtkWidget *button,gpointer pNotebook);
     
    void changeOnglet (GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer user_data);
     
    static GtkWidget *pWindow;
     
    struct Onglet {
    	const gchar *sTitreOnglet;
    	GtkWidget *titreOnglet;
    	GtkWidget *textView;
    	GtkTextBuffer *buffer;
    	GtkTextIter start;
    	GtkTextIter end;
    };
     
    struct Onglet onglet[10];
    uint numOnglet=0; 	// Variable globale qui permettra la selection d'un onglet spécial
    GtkWidget *boxPseudo=NULL;
     
    int main(int argc,char **argv)
    {
    	// Déclaration du widget
    	GtkWidget *pWindow;
    	GtkWidget *pNotebook;
     
    /* 
    *	Box principale
    */
    	GtkWidget *hboxPage;
    	hboxPage = gtk_hbox_new(FALSE, 0);
    	gtk_box_pack_start(GTK_BOX(mainBox), hboxPage, TRUE, TRUE, 0);
     
     
     
    	pNotebook = gtk_notebook_new();		// Création du widget
     
    	gtk_box_pack_start(GTK_BOX(hboxPage), pNotebook, TRUE, TRUE, 0);		// on place le widget
     
    	gtk_notebook_set_tab_pos(GTK_NOTEBOOK(pNotebook), GTK_POS_TOP);	// les onglets seront en haut du widget
    	gtk_notebook_set_scrollable(GTK_NOTEBOOK(pNotebook), TRUE);			// Permet un scroll sur les onglets
     
     
    	onglet[numOnglet].sTitreOnglet = "Pluton";
    	onglet[numOnglet].titreOnglet = gtk_label_new(onglet[numOnglet].sTitreOnglet);
     
    	creerOnglet(onglet[numOnglet].titreOnglet, GTK_NOTEBOOK(pNotebook));
     
     
    /*
    *	Création de la zone d'écriture + bouton envoyer
    */
    	GtkWidget *boxMessage;
    	boxMessage = gtk_hbox_new(FALSE, 0);
    	gtk_box_pack_start(GTK_BOX(mainBox), boxMessage, FALSE, FALSE, 0);
     
    	GtkWidget *zoneEcriture;
    	zoneEcriture = gtk_entry_new();
    	gtk_box_pack_start(GTK_BOX(boxMessage), zoneEcriture, TRUE, TRUE, 0);
    	g_signal_connect(G_OBJECT(zoneEcriture), "activate", G_CALLBACK(envoyerMessage), GTK_WIDGET(pNotebook));
     
    	GtkWidget *envoyerMessage;
    	envoyerMessage = gtk_button_new_with_label("Envoyer");
    	g_signal_connect(G_OBJECT(envoyerMessage), "clicked", G_CALLBACK(envoyerMessageBouton), (GtkWidget*) mainBox);
    	gtk_box_pack_start(GTK_BOX(boxMessage), envoyerMessage, FALSE, FALSE, 0);
     
     
    /*
    *	Création de la zone des pseudos
    */
     
    	boxPseudo = gtk_vbox_new(FALSE, 0);
    	gtk_box_pack_start(GTK_BOX(hboxPage), boxPseudo, FALSE, FALSE, 0);
     
     
    	GtkWidget *label;
    	label = gtk_label_new("Utilisateurs");
    	gtk_box_pack_start(GTK_BOX(boxPseudo), label, FALSE, FALSE, 5);
     
    	GtkWidget *membre1;
    	membre1 = gtk_button_new_with_label("user 1");
    	gtk_box_pack_start(GTK_BOX(boxPseudo), membre1, FALSE, FALSE, 1);
    	g_signal_connect(G_OBJECT(membre1), "clicked", G_CALLBACK(buttonPseudo), pNotebook);
     
    	// Afiche les connectés d'un channel
    	g_signal_connect (G_OBJECT (pNotebook), "switch-page", G_CALLBACK (changeOnglet), (gpointer) hboxPage);
     
    	gtk_widget_show_all(pWindow);
     
    	// On lance la boucle evenementielle
    	gtk_main();
     
    	return EXIT_SUCCESS;
    }
     
     
     
    void envoyerMessage(GtkWidget *pEntry, gpointer pNotebook)
    // l'utilisateur appuie la touche entrée
    {
    	const gchar *sText, *chaine;
    	sText = gtk_entry_get_text(GTK_ENTRY(pEntry));
     
    	chaine = g_strdup_printf("%s \n", sText);
     
    	numOnglet = gtk_notebook_get_current_page(GTK_NOTEBOOK(pNotebook));
     
    	gtk_label_set_label(GTK_LABEL(onglet[numOnglet].textView), chaine);
     
    	gtk_text_buffer_get_end_iter(onglet[numOnglet].buffer, &(onglet[numOnglet].end));
    	gtk_text_buffer_insert(onglet[numOnglet].buffer, &(onglet[numOnglet].end), chaine, -1);
     
    	// on vide le gtkEntry
    	const gchar *chaineVide;
    	chaineVide = "";
    	gtk_entry_set_text(GTK_ENTRY(pEntry), chaineVide);
     
    //	const gchar *sText;
    //	sText = gtk_entry_get_text(GTK_ENTRY(pEntry));
     
    //	gtk_text_buffer_insert(onglet[numOnglet].buffer, &(onglet[numOnglet].end), sText, -1);	
     
    	//gtk_widget_show(onglet[numOnglet].textView);
    }
     
     
    void creerOnglet(GtkWidget *titre_onglet,gpointer pNotebook)
    {
     
    	onglet[numOnglet].textView = gtk_text_view_new();	// Création de la zone de texte
    	gtk_text_view_set_editable(GTK_TEXT_VIEW(onglet[numOnglet].textView), FALSE);
     
    	gtk_notebook_append_page(GTK_NOTEBOOK(pNotebook), onglet[numOnglet].textView, titre_onglet);	// Création d'un nouvel onglet avec la zone de texte dedans
     
    	onglet[numOnglet].buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(onglet[numOnglet].textView));
     
    	gtk_text_buffer_get_start_iter(onglet[numOnglet].buffer,&(onglet[numOnglet].start));
    	gtk_text_buffer_get_end_iter(onglet[numOnglet].buffer, &(onglet[numOnglet].end));
    //	gtk_text_buffer_delete(onglet[numOnglet].buffer, &(onglet[numOnglet].start), &(onglet[numOnglet].end));
     
    	gtk_widget_show(onglet[numOnglet].textView);
    }
     
    int buttonPseudo(GtkWidget *button,gpointer pNotebook)
    {
    	const gchar *titreButton;
    	gint num;
     
    	titreButton = gtk_button_get_label (GTK_BUTTON(button));
     
    	for (gint i=0; i<10; i++) {
    		if(onglet[i].sTitreOnglet == titreButton) {
    			gtk_notebook_set_current_page (GTK_NOTEBOOK(pNotebook), i);
    			return 1;
    		}
     
    	}
    	numOnglet++;
     
    	onglet[numOnglet].sTitreOnglet = titreButton;
    	onglet[numOnglet].titreOnglet = gtk_label_new(onglet[numOnglet].sTitreOnglet);
     
    	creerOnglet(onglet[numOnglet].titreOnglet,GTK_NOTEBOOK(pNotebook));
    }
     
     
     
    void changeOnglet (GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer user_data)
    {
    	numOnglet = page_num;		// numOnglet représente l'onglet selectionné en temps réel ! 
     
    	gtk_box_pack_end_defaults (GTK_BOX(user_data), boxPseudo);	// Suppression
     
     
    	boxPseudo = gtk_vbox_new(FALSE, 0);
    	gtk_box_pack_start(GTK_BOX(user_data), boxPseudo, FALSE, FALSE, 0);
     
    	GtkWidget *label;
    	label = gtk_label_new("Utilisateurs");
    	gtk_box_pack_start(GTK_BOX(boxPseudo), label, FALSE, FALSE, 5);
     
    	GtkWidget *nomDuChan;
    	nomDuChan = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), numOnglet);
     
    	const gchar *sNomDuChan;
    	sNomDuChan = gtk_label_get_text(GTK_LABEL(nomDuChan));
     
    	char *chaine1 = (char *)sNomDuChan;
     
    }
    Désolé de tout afficher comme ca, mais c'est la seule facon de me faire comprendre au final ^^

    En fait, je ne vois pas du tout comment insérer la scrollbar, j'ai essayé comme indiqué ici mais soit la scrollbar ne fonctionne pas, soit elle fonctionne, et lorsque je génère le signal de buttonPseudo, aucun onglet ne se crée.

    Quel est le raprochement de ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gtk_container_add(GTK_CONTAINER(window),scrollbar);
    gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrollbar), box);
    avec mon code... ?

    D'avance merci de vous pencher sur mon problème, si vous avez besoin de précisions n'hésitez pas, je répondrais aussi tot.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 54
    Points : 32
    Points
    32
    Par défaut
    Je vais essayer de reprendre en étant plus clair :

    Variables globales :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    struct Onglet {
    	const gchar *sTitreOnglet;
    	GtkWidget *titreOnglet;
    	GtkWidget *textView;
    	GtkTextBuffer *buffer;
    	GtkTextIter start;
    	GtkTextIter end;
    	GtkWidget *scrollbar;
    	GtkWidget *box;
    };
     
    struct Onglet onglet[10];
    uint numOnglet=0;

    Fonction Créer onglet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    void creerOnglet(GtkWidget *titre_onglet,gpointer pNotebook)
    {
    	onglet[numOnglet].box = gtk_hbox_new(TRUE, TRUE);
    	gtk_notebook_append_page(GTK_NOTEBOOK(pNotebook), onglet[numOnglet].box, titre_onglet);	// Création d'un nouvel onglet avec la zone de texte dedans
     
    	onglet[numOnglet].scrollbar = gtk_scrolled_window_new(NULL, NULL);
    	gtk_container_add(GTK_CONTAINER(onglet[numOnglet].box), onglet[numOnglet].scrollbar);
     
    	onglet[numOnglet].textView = gtk_text_view_new();	// Création de la zone de texte
    	gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(onglet[numOnglet].scrollbar), onglet[numOnglet].textView );
     
     
    	gtk_text_view_set_editable(GTK_TEXT_VIEW(onglet[numOnglet].textView), FALSE);
     
     
     
    	onglet[numOnglet].buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(onglet[numOnglet].textView));
     
    	gtk_text_buffer_get_start_iter(onglet[numOnglet].buffer,&(onglet[numOnglet].start));
    	gtk_text_buffer_get_end_iter(onglet[numOnglet].buffer, &(onglet[numOnglet].end));
    //	gtk_text_buffer_delete(onglet[numOnglet].buffer, &(onglet[numOnglet].start), &(onglet[numOnglet].end));
     
    	gtk_widget_show(onglet[numOnglet].textView);
    }
    Fonction button Pseudo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    int buttonPseudo(GtkWidget *button,gpointer pNotebook)
    {
    	const gchar *titreButton;
    	gint num;
     
    	titreButton = gtk_button_get_label (GTK_BUTTON(button));
     
    	for (gint i=0; i<10; i++) {
    		if(onglet[i].sTitreOnglet == titreButton) {
    			gtk_notebook_set_current_page (GTK_NOTEBOOK(pNotebook), i);
    			return 1;
    		}
     
    	}
    	numOnglet++;
     
    	onglet[numOnglet].sTitreOnglet = titreButton;
    	onglet[numOnglet].titreOnglet = gtk_label_new(onglet[numOnglet].sTitreOnglet);
     
    	creerOnglet(onglet[numOnglet].titreOnglet,GTK_NOTEBOOK(pNotebook));
    }
    Main : appel du premier onglet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /*
    *	Création du notebook
    */
    	pNotebook = gtk_notebook_new();		// Création du widget
    	gtk_box_pack_start(GTK_BOX(hboxPage), pNotebook, TRUE, TRUE, 0);		// on place le widget
     
    	gtk_notebook_set_tab_pos(GTK_NOTEBOOK(pNotebook), GTK_POS_TOP);	// les onglets seront en haut du widget
    	gtk_notebook_set_scrollable(GTK_NOTEBOOK(pNotebook), TRUE);			// Permet un scroll sur les onglets
     
     
    	onglet[numOnglet].sTitreOnglet = "Pluton";
    	onglet[numOnglet].titreOnglet = gtk_label_new(onglet[numOnglet].sTitreOnglet);
     
    	creerOnglet(onglet[numOnglet].titreOnglet, GTK_NOTEBOOK(pNotebook));
    Appel d'un nouvel on onglet via buttonPseudo lors du clic sur le bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	GtkWidget *membre1;
    	membre1 = gtk_button_new_with_label("lodico.j");
     
    	gtk_box_pack_start(GTK_BOX(boxPseudo), membre1, FALSE, FALSE, 1);
    	g_signal_connect(G_OBJECT(membre1), "clicked", G_CALLBACK(buttonPseudo), pNotebook);
    Tel que le code est actuelement, un onglet se crée au démarrage de la page, avec une scrollbar. Seulement l'appuie sur le bouton ne déclenche absolument rien (sauf un message d'erreur dans la console :
    (fenetre:6362): GLib-GObject-WARNING **: invalid cast from `GtkTextView' to `GtkLabel'

    (fenetre:6362): Gtk-CRITICAL **: gtk_label_set_label: assertion `GTK_IS_LABEL (label)' failed
    Merci de votre aide

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Le warning t'indique que qque part tu tentes d'utiliser gtk_label_set_text avec un GtkTextView, ce qui n'est pas licite.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 54
    Points : 32
    Points
    32
    Par défaut
    Tu pense que ca vient de la ??
    Quelqu'un m'a dis que les scrollbars étaient gérées automatiquement sur les textview... du coup je comprends plus rien

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Ca coûte rien de régler ce problème déjà, et de voir ensuite

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 54
    Points : 32
    Points
    32
    Par défaut
    Voila j'ai réglé les messages annexes, il est temps de revenir au sujet maintenant ^^

    Lorsque j'ai l'impression que mon erreur vient du fait que je met un conteneur dans notebook, et que par conséquent il est impossible de faire un gtk_notebook_append_page pour créer un nouvel onglet dans ce conteneur...


    Ca serait simpa que quelqu'un me dise si je suis loin de la vérité...

    merci

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Je commencerais déjà par tenter d'insérer un onglet vide à partir du callback (ou un onglet qui contient juste un gtklabel par ex), et voir si ça marche ou si ça ne marche pas, là j'ai l'impression que tu mélanges 2 pbs (l'ajout d'un onglet, et l'insertion d'un textview qui peut scroller dans un onglet). Il te manque peut être un gtk_widget_show sur l'onglet ou son contenu après que tu l'aies ajouté.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 54
    Points : 32
    Points
    32
    Par défaut
    Le problème est résolue, pour info, il faut faire un gtk_show_all de la box après l'avoir créé !

    Merci quand meme pour ton aide teuf13

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Insertion de n onglets dans une TabControl
    Par planeurbret dans le forum VB.NET
    Réponses: 3
    Dernier message: 23/01/2013, 10h41
  2. Insertion d'un scrollbar dans un TabContainer
    Par stefsas dans le forum ASP.NET
    Réponses: 2
    Dernier message: 14/06/2010, 16h47
  3. Insertion enregistrement dans table
    Par naidinp dans le forum ASP
    Réponses: 13
    Dernier message: 11/09/2003, 09h56
  4. [web] insertion javascript dans du perl
    Par laluna dans le forum Web
    Réponses: 3
    Dernier message: 28/07/2003, 09h50
  5. [TP]Insertion texte dans un autre programme
    Par FLB dans le forum Turbo Pascal
    Réponses: 53
    Dernier message: 14/06/2003, 20h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo