6

私は Gtk+ のチュートリアルとリファレンスにつまずき、適切なレイアウトを作成する方法を理解しようとしています。ドキュメントには、非推奨のBox/HBox/VBoxGtkGridの代わりに使用する必要があると書かれていますが、 をフル ウィンドウ サイズに拡張するのに問題があります。を使用してもまったく影響はありません。GtkGridgtk_widget_set_hexpandGtkGrid

この回答は「プロパティ を見る」ことを示唆していますが、このプロパティが実際に何であるか、どのようexpandに設定するかについての情報を見つけることができません(プロパティごとに常にゲッター/セッターのペアがあると仮定しましたが、この場合はありません)関数)。gtk_widget_set_expand

私は何が欠けていますか?


アップデート:

expand プロパティの設定はまだ機能しません。ボタンはウィンドウの左上隅に「固定」されます。コードは次のとおりです。

static void initializeGui() {
    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "Blabla");
    gtk_window_set_default_size(GTK_WINDOW(window), 800, 500);
    gtk_window_set_hide_titlebar_when_maximized(GTK_WINDOW(window), TRUE);
    gtk_container_set_border_width(GTK_CONTAINER(window), 10);
    g_signal_connect(window, "delete-event", G_CALLBACK(onWindowDelete), NULL);
    g_signal_connect(window, "destroy", G_CALLBACK(onWindowDestroy), NULL);

    GtkWidget *mainbox = gtk_grid_new();
    g_object_set(G_OBJECT(mainbox), "expand", TRUE, NULL);
        GtkWidget *button = gtk_button_new_with_label("Short button");
        g_signal_connect(button, "clicked", G_CALLBACK(onButtonClick), NULL);
        gtk_grid_attach(GTK_GRID(mainbox), button, 0, 0, 1, 1);

        button = gtk_button_new_with_label("Very very long button");
        gtk_grid_attach(GTK_GRID(mainbox), button, 1, 0, 1, 1);

        button = gtk_button_new_with_label("Tiny btn");
        gtk_widget_set_halign(button, GTK_ALIGN_END);
        gtk_grid_attach(GTK_GRID(mainbox), button, 1, 1, 1, 1);
    gtk_container_add(GTK_CONTAINER(window), mainbox);   
    gtk_widget_show_all(window);
}
4

2 に答える 2

6

サンプル コードが含まれていないため、不足しているものを特定するのは非常に困難です。hexpand と vexpand に加えて、halign と valign のプロパティを知っていると役立つ場合がありますが、説明したことは展開だけで実行できるはずです。

また、これを処理する古い方法であるコンテナの「子プロパティ」にも注意する必要があります (たとえばgtk_box_pack_start()、それらがどのように使用されているかを確認するには、参照してください)。expand 子プロパティheexpand/vexpand ウィジェット プロパティがあるため、これは混乱を招く可能性があります。ただし、どちらも明確に文書化されています。

ドキュメントには、非推奨の Box/HBox/VBox の代わりに GtkGrid を使用する必要があると書かれています

これは GtkBox に関するすべての話ではありません: 非推奨ではなく、列または行コンテナーが必要な場合に使用できます。そうは言っても、単一の行/列 GtkGrid はまったく同じことを行い、私の意見では、よりクリーンな API を持っています...

このプロパティの実際の内容と設定方法に関する情報が見つかりません

ドキュメントでは通常、プロパティが何であるかを説明しています: https://developer.gnome.org/gtk3/stable/GtkWidget.html#GtkWidget--expand。セッターがない場合(または一度に複数のプロパティを設定したい場合)は、次を使用できますg_object_set

g_object_set (widget, "expand", TRUE, NULL);

アップデート:

追加されたコードから、GtkGrid は実際に必要に応じて拡張されているように見えます (ただし、視覚的に確認することはできません)。一方、ボタンは展開するように設定されていません。そうすれば、GtkGrids の展開を削除することもできると思います。これは、プロパティがコンテナー チェーンを「上に伝播」する必要があるためです)。

ボタンに何をさせたいかについては言及していませんが、異なる配置 (fill/center/etc) に halign/valign を使用することをお勧めします。

更新 2:

あなたが本当に達成したかったことの説明に基づいて、以下の変更はあなたが求めていることをしているようです. 左側のボタンは展開して左に揃えるように設定され、他のボタンは右に揃えられます。その結果、すべてのボタンがウィンドウの側面に収まり、幅が最小になります。

#include <gtk/gtk.h>

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

    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size(GTK_WINDOW(window), 800, 500);

    GtkWidget *mainbox = gtk_grid_new();

    GtkWidget *button = gtk_button_new_with_label("Short button");
    gtk_widget_set_hexpand (button, TRUE);
    gtk_widget_set_halign (button, GTK_ALIGN_START);
    gtk_grid_attach(GTK_GRID(mainbox), button, 0, 0, 1, 1);

    button = gtk_button_new_with_label("Very very long button");
    gtk_widget_set_halign(button, GTK_ALIGN_END);
    gtk_grid_attach(GTK_GRID(mainbox), button, 1, 0, 1, 1);

    button = gtk_button_new_with_label("Tiny btn");
    gtk_widget_set_halign(button, GTK_ALIGN_END);
    gtk_grid_attach(GTK_GRID(mainbox), button, 1, 1, 1, 1);

    gtk_container_add(GTK_CONTAINER(window), mainbox);
    gtk_widget_show_all(window);

    gtk_main();

    return 0;
}
于 2013-08-29T20:03:41.050 に答える