6

を使用しようとしてset_cell_data_funcGtk.TreeViewColumnます。コードはコンパイルされますが、実行時にセグメンテーション エラーが発生します。代わりに試してみましinsert_column_with_data_funcたが、結果は同じです。

これが私のコードです。あなたが私を助けてくれることを願っています:)

public class Application : Gtk.Window {
    public Application () {
        this.destroy.connect (Gtk.main_quit);
        this.set_default_size (600, 400);

        Gtk.ListStore store = new Gtk.ListStore (2, typeof(int),
            typeof(string));
        Gtk.TreeIter iter;

        store.append (out iter);
        store.set (iter, 0, 0, 1, "A");
        store.append (out iter);
        store.set (iter, 0, 1, 1, "B");
        store.append (out iter);
        store.set (iter, 0, 0, 1, "C");
        store.append (out iter);
        store.set (iter, 0, 0, 1, "D");

        Gtk.TreeView view = new Gtk.TreeView.with_model (store);
        this.add(view);

        Gtk.CellRendererText cell = new Gtk.CellRendererText ();
        Gtk.TreeViewColumn col = new Gtk.TreeViewColumn.with_attributes (
            "Value", cell, "text", 1);
        col.set_cell_data_func (cell, (Gtk.CellLayoutDataFunc)render_value);
        view.append_column (col);
    }

    public void render_value (Gtk.TreeViewColumn column, Gtk.CellRendererText
        cell, Gtk.TreeModel model, Gtk.TreeIter iter) {
        var val = Value (typeof(int));
        model.get_value (iter, 0, out val);
        if ((int)val==1) (cell as Gtk.CellRendererText).background = "#b8cb04";
        val.unset ();
    }

    public static int main (string[] args) {
        Gtk.init (ref args);
        Application app = new Application ();
        app.show_all ();
        Gtk.main ();
        return 0;
    }
}
4

1 に答える 1

5

翻訳された c ソースをデバッグした後、バグを見つけました。

vala翻訳する

public void render_value                            (Gtk.TreeViewColumn column, 
                                                     Gtk.CellRendererText cell, 
                                                     Gtk.TreeModel model, 
                                                     Gtk.TreeIter iter)

あなたのコードから次のcの同等物へ

void application_render_value                       (Application* self,
                                                     GtkTreeViewColumn* column,
                                                     GtkCellRendererText* cell,
                                                     GtkTreeModel* model, 
                                                     GtkTreeIter* iter)

これをリファレンスドキュメントと比較しました。

そこで、データ関数のシグネチャは次のように定義されます

void                (*GtkCellLayoutDataFunc)        (GtkCellLayout *cell_layout,
                                                     GtkCellRenderer *cell,
                                                     GtkTreeModel *tree_model,
                                                     GtkTreeIter *iter,
                                                     gpointer data);    

実装したメソッドに関しては、引数が右に 1 つシフトされることを意味します。したがって、以下はデータ関数/メソッドに適用されます

  • column実際にはセルレンダラーです
  • cell木のモデルです
  • modelは反復子であり、
  • iter関数/メソッドに渡されるデータです

データ関数/メソッドの宣言を次のように変更した場合

public void render_value (Gtk.CellRendererText cell, 
                          Gtk.TreeModel model, Gtk.TreeIter iter, Object data)

すべてがうまくいくはずです。

おそらく、これはCellLayoutDataFuncとして定義されているためpublic delegate voidです。しかし、私は何も知らないので、valaそれは単なる推測です。そうでない場合は、関連するvalaメーリング リストに投稿してください。

于 2013-08-06T16:39:24.057 に答える