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 :

Des lignes horizontales et verticales dans des gtk_tables


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Par défaut Des lignes horizontales et verticales dans des gtk_tables
    Bonjour à tous,

    Je développe actuellement une grosse application avec de nombreux labels à afficher. Pour gérer de manière souple (et efficace) leur disposition, j'utilise des gtk_table. Ca marche bien.

    Parmi les widgets que je veux placer, j'utilise des gtk_hseparator et des gtk_vseparator, mais je viens de me rendre compte que - pour les placer dans la table - ceux-ci, bien qu'ils soient des lignes, ont besoin d'une certaine "épaisseur" (de une unité de ligne ou de colonne). Voici un exemple qui devrait être plus clair :

    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
    /* travail sur les tables et les lignes */
    #include <stdlib.h>
    #include <gtk/gtk.h>
     
    int main (int argc, char *argv[])
    {
      GtkWidget *win;
      GtkWidget *pTable;
      GtkWidget *hline;
      GtkWidget *vline;
      GtkWidget *label[3][2];
      int i,j;
      char tmp[10];
     
      /* Initialize GTK+ */
      gtk_init (&argc, &argv);
     
      /* Creating the main window */
      win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
      gtk_container_set_border_width (GTK_CONTAINER (win), 8);
      gtk_window_set_title (GTK_WINDOW (win), "testing..");
      gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER);
      g_signal_connect (win, "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
    /* creation des labels */
    for (i=0;i<3;i++)
        for (j=0;j<2;j++)
    {
        (void)sprintf(tmp,"%d:%d",i,j);
        label[i][j]=gtk_label_new(tmp);
    }
     
      /* creation d'une ligne horizontale */
      hline=gtk_hseparator_new();
      /* creation d'une ligne verticale */
      vline=gtk_vseparator_new();
     
    /*création de la table mise des widgets dedans */
      pTable=gtk_table_new(3,2,FALSE);
    for (i=0;i<3;i++)
        for (j=0;j<2;j++)
          gtk_table_attach(GTK_TABLE(pTable), label[i][j], i,i+1,j,j+1,GTK_EXPAND|GTK_FILL,GTK_EXPAND,0,0 );
     
     gtk_table_attach(GTK_TABLE(pTable), hline, 0,3,1,2,GTK_EXPAND|GTK_FILL,GTK_EXPAND,0,0 );
     gtk_table_attach(GTK_TABLE(pTable), vline, 1,2,0,2,GTK_EXPAND,GTK_EXPAND|GTK_FILL,0,0 );
     
    /* on ajoute la table dans la fenetre */
     gtk_container_add (GTK_CONTAINER (win), pTable);
     
      /* Enter the main loop */
      gtk_widget_show_all (win);
      gtk_main ();
      return 0;
    }
    Du coup, évidement, les lignes tombent au beau milieu des "cellules" (ici, dans l'exemple, des labels), et ca ne va donc pas.

    L'utilisation de cadres (gtk_frame) ne résoud guère mon problème.

    Bref, ma question est donc: Comment faire pour mettre des lignes "entre" les cellules. Comme ceci ne semble pas être possible, quelle autre(s) solution(s) pourrais-je adopter?

    D'avance merci pour toute aide sur ce point.

    Eric.

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur Web en Loisir
    Inscrit en
    Janvier 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en Loisir

    Informations forums :
    Inscription : Janvier 2006
    Messages : 129
    Par défaut
    salut,

    Comme dirait LiberForce, ne pas utiliser sprintf mais g_snprintf ou g_strdup_printf pour éviter les risques de buffer overflow et donc de crash de l'application.

    gtkTable est déprécié dans GTK3, si tu utilises gtk3 alors il faut utiliser gtkGrid à la place.

    En ce qui concerne ton pb, as-tu essayé d'utiliser css provider et une feuille de style externe ?
    Pas sûr néanmoins que tu puisses résoudre ton soucis, faire des choses qui ont du look et du style sans redéfinir les widgets est difficile.

    En GTK3, tu peux utiliser cairo pour dessiner tes lignes et le texte si tu veux un joli rendu, le tout dans un drawing area. Ca devrait marcher.
    Après si tu as besoin des events sur le texte, il te faut un canevas comme goocanvas (qui utilise cairo d'ailleurs).
    Jette un oeil sur les tuto de zetcode.com pour cairo et tape 'goocanvas reference' dans google pour goocanvas.

    Actuellement, j'utilise goocanvas pour faire de jolies fenêtres. Je place un canvas dans une fenetre top-level et je dessine ce que je veux dedans y compris du texte.
    Tu peux tout gérer: les couleurs, les formes, les backgrounds, faire des arrondis pour créer des boutons, les clicks souris, claviers...

  3. #3
    Membre confirmé
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Par défaut
    Citation Envoyé par rollbich Voir le message
    salut,

    Comme dirait LiberForce, ne pas utiliser sprintf mais g_snprintf ou g_strdup_printf pour éviter les risques de buffer overflow et donc de crash de l'application.
    Oui, je sais, mais ce n'est pas là l'objet de mon post, et puis la chaine de char est définie dès le départ avec son nombre d'éléments (i.e., elle est initialisée), si je dépasse, c'est que mon code est pourri..

    Citation Envoyé par rollbich Voir le message
    gtkTable est déprécié dans GTK3, si tu utilises gtk3 alors il faut utiliser gtkGrid à la place.
    Oui, je sais aussi, j'ai vu ca dans la doc. Mais je développe avec GTK2. Je suis coincé avec gtkTable.

    Citation Envoyé par rollbich Voir le message
    En ce qui concerne ton pb, as-tu essayé d'utiliser css provider et une feuille de style externe ?
    Pas sûr néanmoins que tu puisses résoudre ton soucis, faire des choses qui ont du look et du style sans redéfinir les widgets est difficile.
    Non, pas essayé. Je ne connais pas ces outils. Aie..

    Citation Envoyé par rollbich Voir le message
    En GTK3, tu peux utiliser cairo pour dessiner tes lignes et le texte si tu veux un joli rendu, le tout dans un drawing area. Ca devrait marcher.
    Je suis en GTK2, et n'utilise ni ne connais pas cairo. En revanche, je devrais pouvoir utilise un drawing area en GTK2 il me semble. Je devrais donc pouvoir tracer des lignes, et j'imagine que je dois pouvoir y placer des widgets. Jamais testé. Croyez-vous que c'est faisable, vraiment?

    Citation Envoyé par rollbich Voir le message
    Après si tu as besoin des events sur le texte, il te faut un canevas comme goocanvas (qui utilise cairo d'ailleurs).
    Jette un oeil sur les tuto de zetcode.com pour cairo et tape 'goocanvas reference' dans google pour goocanvas.
    Non, je n'ai pas besoin de gérer des events sur le texte.

    Citation Envoyé par rollbich Voir le message
    Actuellement, j'utilise goocanvas pour faire de jolies fenêtres. Je place un canvas dans une fenetre top-level et je dessine ce que je veux dedans y compris du texte.
    Tu peux tout gérer: les couleurs, les formes, les backgrounds, faire des arrondis pour créer des boutons, les clicks souris, claviers...
    Est-ce spécifique de GTK3?

    En tout cas, merci pour votre temps. Toute aide sur ce point reste bienvenue..

    Eric.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Web en Loisir
    Inscrit en
    Janvier 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en Loisir

    Informations forums :
    Inscription : Janvier 2006
    Messages : 129
    Par défaut
    Est-ce spécifique de gtk3 ?
    Non, tu peux l'installer avec gtk2 aussi.(par contre je ne sais pas s'il installe cairo en même temps)

    sous win32 pour gtk2: http://ftp.gnome.org/pub/GNOME/binar....0.0-win32.zip et http://ftp.gnome.org/pub/GNOME/binar....0.0-win32.zip

    Si tu souhaites passer à gtk3 (cairo sera déjà installé): http://ftp.gnome.org/pub/GNOME/binar....0.1-win32.zip et http://ftp.gnome.org/pub/GNOME/binar....0.1-win32.zip

    sous linux : sudo aptget install libgoocanvas-dev

    moi je suis sous windows donc je ne pourrais pas t'aider plus sous linux pour l'installation.

    bon courage

  5. #5
    Membre confirmé
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Par défaut
    Bon, je reprends - et j'imagine - je clos ce post :

    Je n'ai malheureusement pas le temps d'installer et d'apprendre ces outils (goocanvas, etc.) même si c'est très tentant évidement. J'ai donc contourné la difficulté en définissant une grille bien plus fine, ce qui permet de positionner les lignes entre les widgets. C'est "bourrin", mais ca marche. Voici le même code que dans mon post initial, mais modifié en conséquence, au cas où ca serve à d'autres:

    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
    /* travail sur les tables et les lignes */
    #include <stdlib.h>
    #include <gtk/gtk.h>
     
    int main (int argc, char *argv[])
    {
      GtkWidget *win;
      GtkWidget *pTable;
      GtkWidget *hline;
      GtkWidget *vline;
      GtkWidget *label[3][2];
      int i,j;
      char tmp[10];
     
      /* Initialize GTK+ */
      gtk_init (&argc, &argv);
     
      /* Creating the main window */
      win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
      gtk_container_set_border_width (GTK_CONTAINER (win), 8);
      gtk_window_set_title (GTK_WINDOW (win), "testing..");
      gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER);
      g_signal_connect (win, "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
    /* creation des labels */
    for (i=0;i<3;i++)
        for (j=0;j<2;j++)
    {
        (void)sprintf(tmp,"%d:%d",i,j);
        label[i][j]=gtk_label_new(tmp);
    }
     
      /* creation d'une ligne horizontale */
      hline=gtk_hseparator_new();
      /* creation d'une ligne vertical */
      vline=gtk_vseparator_new();
     
    /*création de la table mise des widgets dedans */
      pTable=gtk_table_new(30,20,TRUE);
    for (i=0;i<3;i++)
        for (j=0;j<2;j++)
          gtk_table_attach(GTK_TABLE(pTable), label[i][j], 10*i,10*(i+1),10*j,10*(j+1),GTK_EXPAND|GTK_FILL,GTK_EXPAND,0,0 );
     
     gtk_table_attach(GTK_TABLE(pTable), hline, 0,30,10,11,GTK_EXPAND|GTK_FILL,GTK_EXPAND,0,0 );
     gtk_table_attach(GTK_TABLE(pTable), vline, 10,11,0,20,GTK_EXPAND,GTK_EXPAND|GTK_FILL,0,0 );
     
    /* on ajoute la table dans la fenetre */
     gtk_container_add (GTK_CONTAINER (win), pTable);
     
      /* Enter the main loop */
      gtk_widget_show_all (win);
      gtk_main ();
      return 0;
    }
    Merci en tout cas pour votre retour,

    Eric.

  6. #6
    Membre éclairé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 331
    Par défaut
    Bonjour,

    Je pense que tu veux obtenir un aspect "tableur" comme celui produit par le tableur qui fait partie de gtk+extra.
    Je n'ai pas de réponse toute faite mais une proposition pour une méthode conduisant peut-être au résultat cherché (en dehors d'utiliser gtk+extra).

    J'ai jeté un coup d'oeil sur gtksheet.c et plus particulièrement sur la fonction gtk_sheet_cell_draw_border(): il semble qu'ils utilisent des appels à gdk_draw_line() pour tracer les limites de chaque cellule. Pour faire la même chose, il faut être capable de récupérer les coordonnées en pixels des sommets des rectangles: tu peux essayer de regarder le source de gtktable pour voir si ceci est faisable.

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

Discussions similaires

  1. [DOM] reorganiser des lignes selon le choix dans un checkbox
    Par mystro7200 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 26/08/2008, 17h39
  2. [MySQL] Problème différentiation des lignes d'une table dans une boucle
    Par ppioul dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 03/05/2008, 18h21
  3. Transférer des lignes d'un datastore dans une table SQL
    Par Deedoo2000 dans le forum Powerbuilder
    Réponses: 7
    Dernier message: 30/10/2006, 14h55
  4. Réponses: 2
    Dernier message: 15/09/2006, 12h18
  5. Réponses: 4
    Dernier message: 24/04/2003, 22h28

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