【发布时间】:2020-04-03 18:29:02
【问题描述】:
我正在尝试使用 GTK3+ 创建一个简单的菜单小部件,程序符合但我在运行时收到此警告:
(menu: 2320): GLib-GObject-WARNING **: 11:40:48.620: ../../../gobject/gsignal.c:2523: signal 'activate' is invalid for instance '0x557d45672290' of type 'GtkWindow'
#include <gtk/gtk.h>
static void activate_about(GtkWidget *window, gpointer data);
int main(int argc, char *argv[]) {
GtkWidget *window;
GtkWidget *vbox;
GtkWidget *menubar;
GtkWidget *fileMenu;
GtkWidget *fileMi;
GtkWidget *quitMi;
GtkWidget *about;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
gtk_window_set_title(GTK_WINDOW(window), "Simple menu");
vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12);
gtk_container_add(GTK_CONTAINER(window), vbox);
menubar = gtk_menu_bar_new();
fileMenu = gtk_menu_new();
fileMi = gtk_menu_item_new_with_label("File");
quitMi = gtk_menu_item_new_with_label("Quit");
about = gtk_menu_item_new_with_label("About");
gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileMi), fileMenu);
gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), about);
gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), quitMi);
gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fileMi);
gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(G_OBJECT(quitMi), "activate",
G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(G_OBJECT(window), "activate",
G_CALLBACK(activate_about), NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
static void activate_about(GtkWidget *window, gpointer data) {
const gchar *authors[] = {"ad Chi", NULL};
gtk_show_about_dialog(GTK_WINDOW(window),
"program-name", "jjkjk",
"version", "0.0.1",
"copyright", "(C) 2017 ad Chi",
"license-type", GTK_LICENSE_GPL_3_0,
"website", "https://github.com/kjk",
"comments", "Totally kj",
"authors", authors,
"documenters", NULL,
"logo-icon-name", "start-here",
"title", "About kj kj",
NULL);
return;
}
我对这个警告感到困惑。谁能解释我是如何触发它们的,以及如何在 gdb 中调试它们?我尝试使用 G_DEBUG=fatal-warnings ./a.out 但信息量不是很大。
【问题讨论】:
-
当您在调试器中运行程序并单步执行时,哪一行会导致该消息?
-
想象一下,你有一只叫 Rex 的狗和一个叫 Tim 的朋友。他们俩都在外面的花园里,你叫蒂姆在里面,但你不是蒂姆,而是和狗在一起。为什么应该这样做?
-
GtkWindow 没有激活信号。检查它的文档 -> developer.gnome.org/gtk3/stable/….
-
如果你需要打开一个对话框,那不是你这样做的方式。我的 Youtube 频道上有一个关于对话框的播放列表。 =>> youtube.com/c/MichaelB-GTK
-
正确的调用是:g_signal_connect(window, "destroy", gtk_main_quit, NULL);和 g_signal_connect(quitMi, "activate", G_CALLBACK( activate_about ), NULL ).:但他们不会修复您的 Dialog 方法。因为现在 Quit 按钮运行 Dialog 。