ボタンや内部状態 (COM ポート使用) に応じてメニュー バーを切り替えるのが好きです。GTK3+ で (できれば Glade と GtkBuilder を使用して) どうすればそれを行うことができますか? GtkOverlay は正しいアプローチではないようです。
2 に答える
0
jcoppens さんの回答に感謝しますが、垂直ボックス内の位置の 1 つが非表示であるが、まだスペースを占有している、または 1 つのメニュー バーの高さでソリューションがどのように見えるかはわかりません。タイトルとメニュー バー (最初のメニュー バーが表示されている) またはメニュー バーとその下のコンテナー (2 番目のメニュー バーが表示されている) の間にギャップが生じませんか?
私はそれを解決しました(あなたの答えを見る前に):
- Glade を使用して新しいファイルを作成し、そこに 2 つのメニュー バーを配置します。
- メイン ウィンドウの Glade ファイルで、タイトルのすぐ下に 1 つのアイテムを含む垂直ボックスを作成します。(私の場合、メイン フレームには 3 つのアイテムを含む垂直ボックスが含まれ、最初の位置は空のままで 2 つのメニュー バーのいずれかが含まれ、2 番目の位置には別のコンテナー内の他のすべての項目が含まれ、3 番目の項目にはステータスが含まれますバー。)
- GtkBuilder を使用した C モジュールでは、次のようにメニュー バーを切り替えます。
/**
* This function adds or replaces the menu bar.
* @param id id string for menu bar
*/
void amci_tester_set_menubar(const gchar *id) {
GtkWidget *menu_bar = GTK_WIDGET(gtk_builder_get_object(builder, id));
GtkBox *box_menu = GTK_BOX(gtk_builder_get_object(builder, "boxMainMenu"));
GList *children = gtk_container_get_children(GTK_CONTAINER(box_menu));
if (children != NULL)
gtk_container_remove(GTK_CONTAINER(box_menu), (GtkWidget *) g_list_first(children)->data);
gtk_box_pack_start(box_menu, menu_bar, false, false, 0);
// Although the visible property is shown as being set in the Glade GUI, in
// the Glade file it is not set.
gtk_widget_set_visible(menu_bar, true);
g_list_free(children);
}
main の最初に、通常の GtkBuilder のものを配置し、GtkBuilder オブジェクトをインスタンス化し、デフォルトの / 最初に表示されるメニュー バー オブジェクトを追加します。
// Init GTK+.
gtk_init(&argc, &argv);
// Create new GtkBuilder object from file.
builder = gtk_builder_new_from_file(glade_filename_app);
if (builder == NULL) {
g_warning("Could not create builder from %s", glade_filename_app);
return 1;
}
// Add menu bar for PC menu bar (default) from file.
if (!gtk_builder_add_from_file(builder, glade_filename_menu_pc, &error)) {
g_warning("%s", error->message);
g_free(error);
return 1;
}
于 2015-06-05T15:30:07.437 に答える