2

GtkWidget の先頭のスペースを設定するにはどうすればよいですか? 下の画像を見るとわかるように、ウィンドウが始まると、ユーザー名/パスワードウィジェットは水平線から少し離れています

ここに画像の説明を入力

私のコード:

  GtkWidget *window;
  GtkWidget *login_label;
  GtkWidget *username_label, *password_label;
  GtkWidget *username_entry, *password_entry;
  GtkWidget *ok_button;
  GtkWidget *hbox0, *hbox1, *hbox2, *hbox3;
  GtkWidget *vbox;

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), "hello");
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_window_set_default_size(GTK_WINDOW(window), 200, 300);

  g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);

  login_label    = gtk_label_new("Login");
  username_label = gtk_label_new("Username: ");
  password_label = gtk_label_new("Password: ");
  username_entry = gtk_entry_new();
  password_entry = gtk_entry_new();

  gtk_entry_set_visibility(GTK_ENTRY(password_entry), FALSE);
  ok_button = gtk_button_new_with_label("Enter");

  g_signal_connect(G_OBJECT(ok_button), "clicked", G_CALLBACK(print_username), ok_button);

  hbox0 = gtk_hbox_new(TRUE, 5);
  hbox1 = gtk_hbox_new(TRUE, 5);
  hbox2 = gtk_hbox_new(TRUE, 5);
  hbox3 = gtk_hbox_new(TRUE, 5);

  vbox =  gtk_vbox_new(FALSE, 10);

  gtk_box_pack_start(GTK_BOX(hbox0), login_label, TRUE, FALSE, 5);
  gtk_box_pack_start(GTK_BOX(hbox1), username_label, TRUE, FALSE, 5);
  gtk_box_pack_start(GTK_BOX(hbox1), username_entry, TRUE, FALSE, 5);
  gtk_box_pack_start(GTK_BOX(hbox2), password_label, TRUE, FALSE, 5);
  gtk_box_pack_start(GTK_BOX(hbox2), password_entry, TRUE, FALSE, 5);
  gtk_box_pack_start(GTK_BOX(hbox3), ok_button, FALSE, FALSE, 5);

  gtk_box_pack_start(GTK_BOX(vbox), hbox0, FALSE, FALSE, 5);
  gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, FALSE, 5);
  gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 5);
  gtk_box_pack_start(GTK_BOX(vbox), hbox3, FALSE, FALSE, 5);

  gtk_container_add(GTK_CONTAINER(window), vbox);

  gtk_widget_show_all(window);
  gtk_main();
4

2 に答える 2

3

これは、これらのウィジェットを保持するために使用しているコンテナーのタイプによって異なります。

それが最も外側のレベルのGtkVBoxであり、単一のウィジェットまたは複数の行の GtkBoxes があると仮定すると、への引数gtk_box_pack_start()、特にfillフラグを確認する必要があります。

更新: あなたのコメントに基づいて、おそらくGtkGridボックスの代わりに a を使用してみてください。グリッドを使用して物事をうまく並べる方が簡単です。

于 2012-10-09T13:36:33.930 に答える
2

あなたが達成しようとしているレイアウトにはおそらくa のGtkGrid内部のGtkDialog方が適切ですが、少なくとも現在のコードについてはお手伝いさせてください。

パッキングについては、GtkLabelウィジェットを固定幅で左揃えにすることを想定しています。GtkEntryウィジェットは、残りの水平スペースを埋めます。

まず、 内のテキストの「配置」を制御できますGtkLabel。aGtkLabelは であるためGtkMisc、それを使用してテキストを揃えることができます。0.0配置は、左/上と1.0右/下の端数です。

username_label = gtk_label_new("Username: ");
password_label = gtk_label_new("Password: ");

/* left align horizontally, center align vertically */
gtk_misc_set_alignment(GTK_MISC(username_label), 0.0, 0.5);
gtk_misc_set_alignment(GTK_MISC(password_label), 0.0, 0.5);

GTK+ 3 を使用していると仮定すると、非推奨のgtk_hbox_new()およびgtk_vbox_new()関数を捨ててgtk_box_new(). GTK+ 3 で廃止された関数を使用すると、予期しない結果が生じることがよくあります。

hbox0 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
hbox3 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
vbox =  gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);

最後に、ラベルが拡張されないようにパッキングを変更できますが、エントリは拡張されます。

/* login label fills all horiz space */
gtk_box_pack_start(GTK_BOX(hbox0), login_label, TRUE, TRUE, 5);

/* labels do NOT expand, but they will fill the space if it's there */
gtk_box_pack_start(GTK_BOX(hbox1), username_label, FALSE, TRUE, 5);
gtk_box_pack_start(GTK_BOX(hbox2), password_label, FALSE, TRUE, 5);

/* entries expand and fill all remaining space */
gtk_box_pack_start(GTK_BOX(hbox1), username_entry, TRUE, TRUE, 5);
gtk_box_pack_start(GTK_BOX(hbox2), password_entry, TRUE, TRUE, 5);

少し古くなっていますが、私の GTK+ チュートリアルの How Packing Effects the Layoutを読んでみてください。Gladeでパッキング プロパティを操作することで、レイアウトを C でハードコーディングする前にすばやくテストできます。

"halign"また、GTK+ 3 以降では、"valign""hexpand"、がおよびプロパティ"vexpand"よりも優先されるようになったことにも注意してください。"expand""fill"

編集

GtkGridこれは、GTK+ 3 の幅対高さのジオメトリを少しうまく処理し、行と列の両方を確保する を使用した「より良い」方法です。

最初にhexpand、エントリ ウィジェットのプロパティを設定します (展開してボックスに「パック」するのではなく)。

/* allow entry widgets to expand */
gtk_widget_set_hexpand(username_entry, TRUE);
gtk_widget_set_hexpand(password_entry, TRUE);

次に、すべてのウィジェットをグリッドにアタッチします。「ログイン」ラベルと「OK」ボタンを複数の列にまたがることができます。

grid = gtk_grid_new();

/* 5 pixels between rows and columns */
gtk_grid_set_row_spacing(GTK_GRID(grid), 5);
gtk_grid_set_column_spacing(GTK_GRID(grid), 5);

/* 5 pixels around entire grid */
gtk_container_set_border_width(GTK_CONTAINER(grid), 5);

/* "login" spans 2 columns */
gtk_grid_attach(GTK_GRID(grid), login_label, 0, 0, 2, 1);

gtk_grid_attach(GTK_GRID(grid), username_label, 0, 1, 1, 1);
gtk_grid_attach(GTK_GRID(grid), username_entry, 1, 1, 1, 1);
gtk_grid_attach(GTK_GRID(grid), password_label, 0, 2, 1, 1);
gtk_grid_attach(GTK_GRID(grid), password_entry, 1, 2, 1, 1);

/* "ok" button spans 2 columns */
gtk_grid_attach(GTK_GRID(grid), ok_button, 0, 3, 2, 1);

gtk_container_add(GTK_CONTAINER(window), grid);

gtk_grid_attach各ウィジェットの配置、幅、高さ (ピクセルではなくセル単位)を指定する引数。詳細については、GtkGridの API ドキュメントを確認してください。

于 2012-10-11T22:06:41.883 に答える