【问题标题】:GTK+, C++, Windows, Binding to glade not workingGTK+、C++、Windows、绑定到空地不工作
【发布时间】:2019-08-18 06:38:15
【问题描述】:

Windows 10

文件GTK_GladeInWindowsSample.c由命令编译

$ gcc GTK_GladeInWindowsSample.c -o GTK_GladeInWindowsSample -mwindows `pkg-config --cflags --libs gtk+-3.0 gmodule-2.0`

档案GTK_GladeInWindowsSample.c

#include <gtk/gtk.h>

GtkWidget *win=NULL; 
GtkBuilder *builder=NULL;
GError *error=NULL;
GtkButton *button=NULL;

void clicked(GtkButton *button, gpointer user_data)
{
    gtk_button_set_label(button, "clicked");
}

void destroy_(GtkWidget *object, gpointer user_data)
{
    gtk_main_quit();
}

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

    if(!gtk_builder_add_from_file(builder, "GTK_GladeInWindowsSample.glade", &error))
    {
        return 0;
    }

    win=GTK_WIDGET(gtk_builder_get_object(builder, "window1"));
    button=GTK_BUTTON(gtk_builder_get_object(builder, "button1"));
    gtk_widget_realize(win);
    gtk_builder_connect_signals(builder, NULL);  
    gtk_widget_show_all(win);
    g_object_unref(builder);

    gtk_main();

    return 0;
}

文件GTK_GladeInWindowsSample.glade

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
  <requires lib="gtk+" version="3.20"/>
  <object class="GtkWindow" id="window1">
    <property name="can_focus">False</property>
    <signal name="destroy" handler="destroy_" swapped="no"/>
    <child>
      <placeholder/>
    </child>
    <child>
      <object class="GtkButton" id="button1">
        <property name="label" translatable="yes">button</property>
        <property name="visible">True</property>
        <property name="can_focus">True</property>
        <property name="receives_default">True</property>
        <property name="margin_left">50</property>
        <property name="margin_right">50</property>
        <property name="margin_top">50</property>
        <property name="margin_bottom">50</property>
        <signal name="clicked" handler="clicked" swapped="no"/>
      </object>
    </child>
  </object>
</interface>

当我按下按钮时,什么也没有发生(它应该将文本更改为“点击”)。 destroy_ 也没有被调用

【问题讨论】:

    标签: gtk


    【解决方案1】:

    查看gtk_builder_connect_signals()上的文档:

    在为 Windows 编译应用程序时,必须声明信号 带有 G_MODULE_EXPORT 的回调,否则它们将不会放入符号中 桌子。在 Linux 和 Unices 上,这不是必需的;应用程序应 而是使用 -Wl,--export-dynamic CFLAGS 编译并链接 反对 gmodule-export-2.0。

    所以你的处理程序声明需要看起来像

    G_MODULE_EXPORT void clicked(GtkButton *button, gpointer user_data)
    

    在每个回调函数上交替调用gtk_builder_add_callback_symbol()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 2018-01-23
      • 2016-08-05
      • 2015-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多