gpt4 book ai didi

在 GTK3+ C 中创建菜单

转载 作者:行者123 更新时间:2023-12-04 11:40:05 27 4
gpt4 key购买 nike

所以我正在尝试使用 C 在 GTK3+ 中创建一个简单的菜单。我正在尝试重新创建在以下位置找到的菜单:

https://developer.gnome.org/gtk-tutorial/stable/x743.html

所以我复制了代码,并一直试图隔离我需要的部分,并将所说的部分转换为 3+。我对这个代码段不太走运。首先,不推荐使用 gtk_option_menu,取而代之的是 gtk_combo_box。我试图找到相关的教程,但没有任何结果。

老实说,我什至不知道如何使用 GTK 创建菜单背后的理论,所以我很难进行转换。我在这里几乎是瞎飞。

我的代码如下:

#include "/usr/include/gtk-3.0/gtk/gtk.h"

static void print_stuff( GtkWidget *item, gpointer data) {

printf("Hello World!\n");
return;
}

static GtkWidget *make_menu_item(gchar *name, GCallback callback, gpointer data ){

GtkWidget *item;
item = gtk_menu_item_new_with_label (name);
g_signal_connect (item, "activate", callback, (gpointer) data);
gtk_widget_show (item);
return item;
}


static void create_range_controls( void ){

GtkWidget *window;
GtkWidget *box1, *box2, *box3;
GtkWidget *button;
GtkWidget *scrollbar;
GtkWidget *separator;
GtkWidget *opt, *menu, *item;
GtkWidget *label;
GtkWidget *scale;
GObject *adj1, *adj2;

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_window_set_title(GTK_WINDOW(window), "range controls");

box1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_container_add(GTK_CONTAINER (window), box1);
gtk_widget_show(box1);

opt = gtk_option_menu_new ();
menu = gtk_menu_new ();
item = make_menu_item ("Top", G_CALLBACK (print_stuff), NULL);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);

item = make_menu_item ("Bottom", G_CALLBACK (print_stuff), NULL);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);

item = make_menu_item ("Left", G_CALLBACK (print_stuff), NULL);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);

item = make_menu_item ("Right", G_CALLBACK (print_stuff), NULL);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);

gtk_option_menu_set_menu(GTK_OPTION_MENU(opt), menu);
gtk_box_pack_start(GTK_BOX (box1), opt, TRUE, TRUE, 0);
gtk_widget_show(opt);

gtk_widget_show (window);

}

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

gtk_init (&argc, &argv);

create_range_controls ();

gtk_main ();

return 0;
}

谁能说明我做错了什么,为什么?是否有 GTK3+ 的教程,比如我上面链接的 GTK2+ 教程?

谢谢!

最佳答案

很难手动完成所有操作。您可以将 glade 用于快速开发接口(interface)。但这里有一个关于如何在 gtk+-3.x 系列中使用菜单和 gtk_combo_box 的小例子:

// cc menu-gtk3.c `pkg-config --cflags --libs gtk+-3.0` -o menu-gtk3

#include <gtk/gtk.h>

void cb_combo_change (GtkComboBox *combo, gpointer user_data) {
gint index = gtk_combo_box_get_active (combo);
if (index) { // we need some string to be displayed
GtkTreeModel *model;
GtkTreeIter iter;
gchar *buf;
model = gtk_combo_box_get_model (combo);
gtk_tree_model_iter_nth_child (model, &iter, NULL, index);
gtk_tree_model_get (model, &iter, 0, &buf, -1);
g_print ("%s\n", buf);
g_free (buf);
}
}

void show_message_cb (GtkMenuItem *item, gpointer user_data) {
g_print ("Hello world\n");
}

int main (int argc, char *argv[]) {
GtkWidget *toplevel;
GtkWidget *center_vbox;
GtkWidget *menuBar;
GtkWidget *menuItem1;
GtkWidget *submenu1;
GtkWidget *item_message;
GtkWidget *item_quit;
GtkWidget *combobox;
GtkListStore *combo_ls;
GtkCellRenderer *renderer;
GtkTreeIter iter;
gtk_init (&argc, &argv);
/* create toplevel window */
toplevel = gtk_window_new (GTK_WINDOW_TOPLEVEL);
/* create the box here */
center_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
/* create menubar */
menuBar =gtk_menu_bar_new ();
/* create 1st menu item */
menuItem1 = gtk_menu_item_new_with_mnemonic ("_Application");
/* add the submenu for the 1st menu item */
submenu1 = gtk_menu_new ();
/* add the message item */
item_message = gtk_menu_item_new_with_label ("Message");
/* add the quit item menu for the submenu */
item_quit = gtk_menu_item_new_with_label ("Quit");
/* create the list model for the combo */
combo_ls = gtk_list_store_new (1, G_TYPE_STRING);
/* add some strings */
gtk_list_store_append (combo_ls, &iter);
gtk_list_store_set (combo_ls, &iter, 0, "Choose one", -1);
gtk_list_store_append (combo_ls, &iter);
gtk_list_store_set (combo_ls, &iter, 0, "String1", -1);
gtk_list_store_append (combo_ls, &iter);
gtk_list_store_set (combo_ls, &iter, 0, "String2", -1);
/* add a combobox with the model
* you could use combo_box_text for faster text append */
combobox = gtk_combo_box_new_with_model (GTK_TREE_MODEL (combo_ls));
/* destroy here the model, because you increase its reference
* by attach it to the combo */
g_object_unref (combo_ls);
/* now prepare the combo */
renderer = gtk_cell_renderer_text_new ();
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox), renderer, TRUE);
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer, "text", 0, NULL);
/* set index to 0 */
gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), 0);
/* packing */
gtk_menu_shell_append (GTK_MENU_SHELL (submenu1), item_message);
gtk_menu_shell_append (GTK_MENU_SHELL (submenu1), item_quit);
gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuItem1), submenu1);
gtk_menu_shell_append (GTK_MENU_SHELL (menuBar), menuItem1);
gtk_box_pack_start (GTK_BOX (center_vbox), menuBar, TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (center_vbox), combobox, FALSE, FALSE, 0);
gtk_container_add (GTK_CONTAINER (toplevel), center_vbox);
/* signal handlers */
g_signal_connect (toplevel, "destroy", G_CALLBACK (gtk_main_quit), NULL);
g_signal_connect (combobox, "changed", G_CALLBACK (cb_combo_change), NULL);
g_signal_connect_swapped (item_quit, "activate", G_CALLBACK (gtk_widget_destroy), toplevel);
g_signal_connect (item_message, "activate", G_CALLBACK (show_message_cb), NULL);
/* let them loose */
gtk_widget_show_all (toplevel);
gtk_main ();
return 0;
}

关于在 GTK3+ C 中创建菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28132798/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com