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 :

GTK 3 renderer "width-chars"&"width"


Sujet :

GTK+ avec C & C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Roumanie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2016
    Messages : 6
    Points : 1
    Points
    1
    Par défaut GTK 3 renderer "width-chars"&"width"
    Bonjour,

    une problème de gtk3:

    g_object_set( G_OBJECT( renderer ), "width-chars", ........

    n’a aucun effet, mais
    g_object_set( G_OBJECT( renderer ), "width", ........

    fonctionne, mais j'ai besoin de "width-chars"

    Comment je peux résoudre ?

    Merçi, à l’avance !


    Host : romeo-office Kernel: 4.8.0-53-generic x86_64 (64 bit gcc: 5.4.0)
    Desktop: KDE Plasma 5.8.8 (Qt 5.6.1) Distro: Linux Mint 18.2 Sonya

    libgtk-3-0:
    Installed: 3.18.9-1ubuntu3.3
    Candidate: 3.18.9-1ubuntu3.3
    Version table:
    *** 3.18.9-1ubuntu3.3 500
    500 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages
    100 /var/lib/dpkg/status
    3.18.9-1ubuntu3 500
    500 http://archive.ubuntu.com/ubuntu xenial/main amd64 Packages

  2. #2
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Bonjour,

    une ligne de code isolée et incomplète ne nous apporte pas beaucoup d'information. Essaie de créer une application minimaliste qui reproduit ton problème et que l'on pourra compiler et tester. Tu maximiseras tes chances d'avoir une réponse.
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Roumanie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2016
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Voici un exemple de code
    gcc `pkg-config --cflags gtk+-3.0` main.c -o main `pkg-config --libs gtk+-3.0`
    Fichiers attachés Fichiers attachés
    • Type de fichier : c main.c (3,2 Ko, 73 affichages)

  4. #4
    Membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2017
    Messages : 43
    Points : 64
    Points
    64
    Par défaut
    Bonsoir,

    "width-chars" semble être la valeur alloué à la cellule (peut être utile pou le scrolle). Or GtkTreeView calcule la largeur de la colonne en fonction du contenue des cellules.
    Peut être qu'en utilisant PangoFontMetrics tu aura le comportement que tu souhaite.

    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
     
       PangoFontDescription *description = pango_font_description_from_string( "Courier New 12" );
       gtk_widget_override_font( *list_view, description);
       PangoContext *context = gtk_widget_get_pango_context (*list_view);
       PangoFontMetrics *metrics = pango_context_get_metrics (context,
                                            pango_context_get_font_description (context),
                                            pango_context_get_language (context));
       int width_char = pango_font_metrics_get_approximate_char_width (metrics);
       int width_chars = 42 *width_char/PANGO_SCALE;
     
     
       gtk_tree_view_set_grid_lines( GTK_TREE_VIEW( *list_view ), GTK_TREE_VIEW_GRID_LINES_BOTH );
     
       renderer = gtk_cell_renderer_text_new();
       column   = gtk_tree_view_column_new_with_attributes( "test", renderer, "text", 0, NULL );
       g_object_set( G_OBJECT( renderer ), "width", width_chars, NULL );
       //gtk_tree_view_column_set_fixed_width(column, width_chars);
       gtk_tree_view_append_column( GTK_TREE_VIEW( *list_view ), column );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
       *list_view = gtk_tree_view_new();
       gtk_widget_override_font( *list_view, pango_font_description_from_string( "Courier New 12" ));
       gtk_tree_view_set_grid_lines( GTK_TREE_VIEW( *list_view ), GTK_TREE_VIEW_GRID_LINES_BOTH );
     
       renderer = gtk_cell_renderer_text_new();
       column   = gtk_tree_view_column_new_with_attributes( "test", renderer, "text", 0, NULL );
    //   g_object_set( G_OBJECT( renderer ), "width-chars", 42, NULL );
       gtk_tree_view_append_column( GTK_TREE_VIEW( *list_view ), column );

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Roumanie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2016
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par aeiou Voir le message
    Bonsoir,

    "width-chars" semble être la valeur alloué à la cellule (peut être utile pou le scrolle). Or GtkTreeView calcule la largeur de la colonne en fonction du contenue des cellules.
    Peut être qu'en utilisant PangoFontMetrics tu aura le comportement que tu souhaite.

    [/CODE]
    d’accord, mais jusqu’au gtk3 3.18.9 j’ai utilisé sans problème "width-chars".
    définition pour "width-chars"

    "The “width-chars” property

    “width-chars” gint

    The desired width of the cell, in characters. If this property is set to -1, the width will be calculated automatically, otherwise the cell will request either 3 characters or the property value, whichever is greater.
    Flags: Read / Write
    Allowed values: >= -1
    Default value: -1"

    n’est plus valide ?
    et pour chaque cellule doit calculer "width" "pixels" ??
    je pense qu’il a un "bug".

    S’il vous plaît excuser mon Français, je suis originaire de Roumanie .

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Roumanie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2016
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Une autre solution
    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
     
    #include<gtk/gtk.h>
    #include<string.h>
     
    void list_create_and_fill_model( GtkWidget *list_view ) {
       GtkListStore     *list_store;
       GtkTreeIter       iter;
       GtkTreeSelection *selection;
     
       list_store = gtk_list_store_new( 2,  G_TYPE_STRING, G_TYPE_STRING );
       gtk_tree_view_set_model( GTK_TREE_VIEW( list_view), GTK_TREE_MODEL( list_store ));
     
       for ( int i = 0; ( i < 20 ); i++ ) {
          gtk_list_store_append( list_store, &iter );
          gtk_list_store_set(  list_store,
                              &iter,
                               0, "Testing",
                               1, "Another",
                              -1 );
       }
       selection = gtk_tree_view_get_selection( GTK_TREE_VIEW( list_view ));
       gtk_tree_selection_select_path( selection, gtk_tree_path_new_from_string( "0" ));
    }
     
    void GetTextPixels( GtkWidget *widget,
                        gchar     *gcFont,
                        gint       giLength,
                        gint      *width,
                        gint      *height ) {
       PangoLayout          *layout;
       PangoFontDescription *fontdesc;
       gchar                *fill_char;
     
       fill_char = ( gchar * )g_malloc( sizeof( gchar ) * ( giLength + 1 ));
       memset( fill_char, 'A', giLength );
       fill_char[ giLength + 1 ] = '\0';
       layout   = gtk_widget_create_pango_layout( widget, fill_char );
       fontdesc = pango_font_description_from_string( gcFont );
       pango_layout_set_font_description( layout, fontdesc );
       pango_layout_get_pixel_size( layout, width, height );
       pango_font_description_free( fontdesc );
       g_object_unref( layout );
       g_free( fill_char );
    }
     
    void list_view_and_model( GtkWidget *box,
                              GtkWidget **list_view ) {
       GtkTreeViewColumn *column;
       GtkCellRenderer   *renderer;
       GtkWidget         *scrolled_win;
       gint               width, height;
     
       *list_view = gtk_tree_view_new();
       gtk_widget_override_font( *list_view, pango_font_description_from_string( "Courier New 12" ));
       gtk_tree_view_set_grid_lines( GTK_TREE_VIEW( *list_view ), GTK_TREE_VIEW_GRID_LINES_BOTH );
     
       GetTextPixels( *list_view, "Courier New 12", 40, &width, &height );
     
       renderer = gtk_cell_renderer_text_new();
       column   = gtk_tree_view_column_new_with_attributes( "test", renderer, "text", 0, NULL );
    //   g_object_set( G_OBJECT( renderer ), "width-chars", 40, NULL );
       g_object_set( G_OBJECT( renderer ), "width", width, NULL );
       gtk_tree_view_append_column( GTK_TREE_VIEW( *list_view ), column );
     
     
       renderer = gtk_cell_renderer_text_new();
       column   = gtk_tree_view_column_new_with_attributes( "test", renderer, "text", 1, NULL );
       g_object_set( G_OBJECT( renderer ), "width-chars", 30, NULL );
       gtk_tree_view_append_column( GTK_TREE_VIEW( *list_view ), column );
     
     
       gtk_tree_selection_set_mode( gtk_tree_view_get_selection( GTK_TREE_VIEW( *list_view )), GTK_SELECTION_BROWSE );
       scrolled_win = gtk_scrolled_window_new( NULL, NULL );
       gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( scrolled_win ), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC );
     
       list_create_and_fill_model( *list_view );
     
       scrolled_win = gtk_scrolled_window_new( NULL, NULL );
       gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( scrolled_win ), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC );
       gtk_widget_set_size_request( GTK_WIDGET( scrolled_win ), 600, 400 );
       gtk_container_add( GTK_CONTAINER( scrolled_win ), *list_view );
       gtk_box_pack_start( GTK_BOX( box ), scrolled_win, TRUE, TRUE, 0 );
       gtk_tree_view_expand_all( GTK_TREE_VIEW( *list_view ));
    }
     
    int main( int argc, char *argv[] ) {
     
       GtkWidget *window;
       GtkWidget *main_box;
       GtkWidget *list_view;
     
       gtk_init(&argc, &argv);
       window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
       gtk_window_set_default_size(GTK_WINDOW(window), 400, 250);
       gtk_window_set_title(GTK_WINDOW(window), "Linux-buddy.blogspot.com");
       main_box = gtk_box_new( GTK_ORIENTATION_VERTICAL, 0 );
       gtk_container_set_border_width( GTK_CONTAINER( main_box ), 0 );
       gtk_container_add( GTK_CONTAINER( window ), main_box );
     
       list_view_and_model( main_box, &list_view );
       gtk_widget_show_all( window );
       gtk_main();
     
       return 0;
    }
    mais il reste encore le problème de compatibilité entre les GTK versions

  7. #7
    Membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2017
    Messages : 43
    Points : 64
    Points
    64
    Par défaut
    g_object_set( G_OBJECT( renderer ), "width-chars", ........

    n’a aucun effet, mais
    A quel effet t'attendais tu ?

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Roumanie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2016
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par aeiou Voir le message
    A quel effet t'attendais tu ?

    "The “width-chars” property

    “width-chars” gint

    The desired width of the cell, in characters. If this property is set to -1, the width will be calculated automatically, otherwise the cell will request either 3 characters or the property value, whichever is greater.
    Flags: Read / Write
    Allowed values: >= -1
    Default value: -1"

  9. #9
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Je confirme, ce que tu attends n'est pas clair.

    De ce que je vois, width-chars définit la largeur "souhaitée" en nombre de caractères. D'après mes tests avec GTK 3.10.8, si tu définis width-chars = 10 et que la donnée la plus longue fait 15 caractères, la colonne ne fera que 10 caractères de large. En revanche, si tu définis width-chars=15 et que tu as au maximum 10 caractères dans les données, la colonne fera 10 caractères de large, s'adaptant au contenu pour laisser de la place aux autres colonnes.

    Quel comportement attends-tu (en français, ou avec une capture d'écran) ? Quelles différences de comportement vois tu entre les versions de GTK+ ?
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Roumanie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2016
    Messages : 6
    Points : 1
    Points
    1
    Par défaut width-chars
    Citation Envoyé par liberforce Voir le message
    Je confirme, ce que tu attends n'est pas clair.

    De ce que je vois, width-chars définit la largeur "souhaitée" en nombre de caractères. D'après mes tests avec GTK 3.10.8, si tu définis width-chars = 10 et que la donnée la plus longue fait 15 caractères, la colonne ne fera que 10 caractères de large. En revanche, si tu définis width-chars=15 et que tu as au maximum 10 caractères dans les données, la colonne fera 10 caractères de large, s'adaptant au contenu pour laisser de la place aux autres colonnes.

    Quel comportement attends-tu (en français, ou avec une capture d'écran) ? Quelles différences de comportement vois tu entre les versions de GTK+ ?
    l’écart vers le haut, ne satisfait pas à la valeur indiquée du "width-chars".
    et faire les tests contre 3.18.9 !
    largeur c'est non "souhaitée" mais imposée.
    si vous avez besoin de 50 caractères, 5o caractères doivent être
    et cela ne va pas dans 3.18.9

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