【问题标题】:receiving GLib-GObject-WARNING signal 'activate' is invalid for instance例如,接收 GLib-GObject-WARNING 信号“激活”是无效的
【发布时间】: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 。

标签: c gtk3


【解决方案1】:

您将activate_about 处理程序连接到window 实例,而不是将其连接到about 菜单项。 GtkWindow 没有 activate 信号。

另外,您不需要将g_signal_connect() 的第一个参数强制转换为GObject

【讨论】:

  • 是的,他试图监视来自GtkMenuItemactivate 信号。他可能需要g_signal_connect_swapped ( about, "activate", G_CALLBACK ( activate_about ), window )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多