0

私はGtkTreeViewウィジェットを使用しており、子行を開閉する「エキスパンダー」アイコンの外観を変更したいと考えています。アイコンを私たち全員がよく知っている三角形にしたいのですが、ボックスで表示されています」代わりに +" および "-" 記号を使用してください。

最初は、設定できるスタイルの列挙があるはずだと思っていましたが、見つかりません。次に、テーマの gtkrc ファイルに設定できるスタイル プロパティがあるのではないかと考えましたが、存在しないと思います。最後に、次のように draw メソッドを手動でオーバーライドすることにしました。

GtkWidget *pTreeView = gtk_tree_view_new_with_model((GtkTreeModel *)pTreeModel);
(GTK_STYLE_GET_CLASS(pTreeView->style))->draw_expander = my_draw_expander_override;

ただしmy_draw_expander_override()、呼び出されることはなく、エキスパンダーはボックス化された「+」および「-」アイコンのままです。

GtkTreeViewエキスパンダーアイコンの外観を変更したり、自分で描画したりする方法を知っている人はいますか?

事前にたくさんありがとう!

4

2 に答える 2

0

draw_expander を上書きする方法のサンプル コードを次に示します。すべてのパラメータを正しく設定するには、必ずマニュアルを参照する必要があります。

#include <gtk/gtk.h>
#include <cairo.h>


enum {
  COL_1,
  N_COLS
};

void draw_expander (GtkStyle        *style,
                    GdkWindow       *window,
                    GtkStateType         state_type,
                    GdkRectangle    *area,
                    GtkWidget       *widget,
                    const gchar     *detail,
                    gint         x,
                    gint         y,
                    GtkExpanderStyle     expander_style) {


  cairo_t *cr;

  cr = gdk_cairo_create (window);

  cairo_set_source_rgb(cr, 0, 0, 0);

  cairo_move_to (cr, 0, 0);
  cairo_line_to (cr, 0, 10);
  cairo_line_to (cr, 10, 5);
  cairo_close_path (cr);

  cairo_stroke  (cr);
}


GtkWidget *build_view (); /* just supply your own */


int main (int argc, char *argv[]) {
  gtk_init (&argc, &argv);

  GtkWidget *window;
  GtkWidget *view;

  window = g_object_new (GTK_TYPE_WINDOW, NULL);  
  view = build_view ();
  gtk_container_add (GTK_CONTAINER (window), view);

  GtkStyle *style = gtk_widget_get_style (view);
  GtkStyleClass *klass = GTK_STYLE_GET_CLASS (style);

  klass->draw_expander = draw_expander;

  gtk_widget_show_all (window);
  gtk_main ();

  return 0;
}
于 2013-02-11T21:16:49.600 に答える
0

たぶん、エキスパンダーを表示したい方法で描画するテーマに切り替えてみてください。三角形が1つであることを承認するように「強制」すると、一部のユーザーが少し失礼だと思うかもしれません。エキスパンダーを引き、これを変更する機会を拒否する唯一の方法です。

それは特にテーマが作成されたものです-誰もが彼女が望む外観を持つことができるように.

まあ、とにかく残念なことに、実際には GTK はバージョン 2 からバージョン 3 に移行中なので、使用しているバージョンによっては別のシグナルを上書きする必要があります。

GTK 3 では、"draw" シグナルで既に cairo コンテキストを取得しているため、少し簡単になるはずですが、GTK 2 でも可能です。ここでは、"expose-event" シグナルを使用する必要があります。

例として、GTK バージョン 2 でそれを行う方法のスニペットを示します。私は本物のアーティストではないので、見栄えがよくないかもしれませんが、きっと素敵なデザインを思いつくでしょう。

...ああ、それと、状態に応じて塗り方を変えることを忘れないでください...

#include <gtk/gtk.h>
#include <cairo.h>


gboolean draw (GtkWidget *widget, GdkEventExpose *event, gpointer data) {

  cairo_t *cr;

  cr = gdk_cairo_create (widget->window);

  cairo_set_source_rgb(cr, 0, 0, 0);

  cairo_move_to (cr, 0, 0);
  cairo_line_to (cr, 0, 10);
  cairo_line_to (cr, 10, 5);
  cairo_close_path (cr);

  cairo_stroke  (cr);

  return TRUE;
}


int main (int argc, char *argv[]) {
  gtk_init (&argc, &argv);

  GtkWidget *window;
  GtkWidget *expander;


  window = g_object_new (GTK_TYPE_WINDOW, NULL);  
  expander = g_object_new (GTK_TYPE_EXPANDER, NULL);
  gtk_container_add (GTK_CONTAINER (window), expander);

  g_signal_connect (expander, "expose-event", draw, NULL);

  gtk_widget_show_all (window);
  gtk_main ();

  return 0;
}

編集:

私が見たように、1 つのインスタンスだけの外観を変更するのではなく、すべてのエキスパンダーの外観を変更したいようです。これを実現するには、次のようにデフォルト ハンドラーを上書きする必要があります。

#include <gtk/gtk.h>
#include <cairo.h>


gboolean draw (GtkWidget *widget, GdkEventExpose *event) {

  cairo_t *cr;

  cr = gdk_cairo_create (widget->window);

  cairo_set_source_rgb(cr, 0, 0, 0);

  cairo_move_to (cr, 0, 0);
  cairo_line_to (cr, 0, 10);
  cairo_line_to (cr, 10, 5);
  cairo_close_path (cr);

  cairo_stroke  (cr);

  return TRUE;
}


int main (int argc, char *argv[]) {
  gtk_init (&argc, &argv);

  GtkWidget *window;
  GtkWidget *expander;
  GtkWidgetClass *klass;

  window = g_object_new (GTK_TYPE_WINDOW, NULL);  
  expander = g_object_new (GTK_TYPE_EXPANDER, NULL);
  gtk_container_add (GTK_CONTAINER (window), expander);

  klass = g_type_class_peek (GTK_TYPE_EXPANDER);
  klass->expose_event =  draw;

  gtk_widget_show_all (window);
  gtk_main ();

  return 0;
}
于 2013-02-11T21:33:44.757 に答える