5

ビルダーを使用してコンテンツをロードする新しいウィジェットを作成できることが理想的です。

public class MyDialog : Dialog
  {
    public MyDialog
      {
        Gtk.Builder builder = new Gtk.Builder ();
        builder.add_from_file ("dialog.ui");
        this = builder.get_object ("my_dialog") as Gtk.Widget;
      }
    }

無効な割り当てであるため、明らかにこれは機能しませんthis =が、ビルダーから読み込まれたものを使用してウィジェットのコンテンツを設定する方法があるかどうか疑問に思っています。

それまでの間、私this = ...

var content = get_content_area ();
var dialog = builder.get_object ("my_dialog") as Gtk.Widget;
var _content = (dialog as Dialog).get_content_area ();
_content.reparent (content);

これは機能しますが、直接ロードできることは私には理にかなっています.

ありがとう。

4

3 に答える 3

3

将来誰かがこの質問に出くわした場合に備えて、Vala 0.22 には複合ウィジェット テンプレートが搭載されており、上記の問題をはるかに簡単に解決できます。複合テンプレートを使用すると、Glade でウィジェットを定義し、属性を使用してクラスのどの部分がウィジェットのどの要素を参照しているかを Vala に伝え、コールバックを接続することができますGtk.Builder。手動でまったく使用する必要はありません。

詳細はhttp://blogs.gnome.org/tvb/2013/05/29/composite-templates-lands-in-vala/にあります。

于 2013-10-16T10:13:26.507 に答える
2

これは Geary で広範囲に行われます。私が最もよく使ったトリックは、Glade でオブジェクト (つまり、Gtk.Dialog) をまったくビルドせず、その内容だけをビルドすることです。次に、Vala でダイアログ/ウィンドウ自体をコーディングするだけです。

Box、Grid、およびその他のコンポーネントをトップレベルとして明示的にサポートしていなかったため、Glade 3.15 がリリースされる前に、これを行うのは一種の苦痛でした。まだアップグレードしていない場合は、お勧めします。

于 2013-03-08T01:15:40.937 に答える
1

いいえ、できません。への C++ バインディングにGtk.Builder は thisがありますが、残念ながら C++ テンプレートに依存しており、他のバインディングには実装されていません。

于 2013-03-05T22:03:27.490 に答える