【问题标题】:How do we create a simple GUI app with glade and C?我们如何使用 glade 和 C 创建一个简单的 GUI 应用程序?
【发布时间】:2021-04-10 13:29:39
【问题描述】:

由于我是 glade 和 C 的新手,我正在尝试构建一个非常简单的 GUI,它有一个输入框、一个标签和一个按钮。当按下按钮时,文本框中存在的任何值都会显示在标签中。这是我的空地,

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
  <requires lib="gtk+" version="3.20"/>
  <object class="GtkWindow" id="windows1">
    <property name="can_focus">False</property>
    <child>
      <placeholder/>
    </child>
    <child>
      <object class="GtkFixed">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <child>
          <object class="GtkButton" id="button1">
            <property name="label" translatable="yes">button</property>
            <property name="width_request">100</property>
            <property name="height_request">80</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <signal name="clicked" handler="on_clicked" swapped="no"/>
          </object>
          <packing>
            <property name="x">182</property>
            <property name="y">146</property>
          </packing>
        </child>
        <child>
          <object class="GtkEntry" id="entry1">
            <property name="width_request">100</property>
            <property name="height_request">80</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
          </object>
          <packing>
            <property name="x">68</property>
            <property name="y">45</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="label1">
            <property name="width_request">100</property>
            <property name="height_request">80</property>
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">label</property>
          </object>
          <packing>
            <property name="x">321</property>
            <property name="y">44</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

这是按下按钮时在终端中打印 clicked 的 C 逻辑。

#include <gtk/gtk.h>

void on_clicked(GtkButton * b, gpointer data)
{
    (void)b;
    (void)data;
    printf("clicked");
}

int main (int argc, char *argv[])
{
    GtkBuilder      *builder;
    GtkWidget       *window;

    gtk_init(&argc, &argv);

    builder = gtk_builder_new();
    gtk_builder_add_from_file (builder, "example.glade", NULL);

    window = GTK_WIDGET(gtk_builder_get_object(builder, "window1"));

    gtk_builder_connect_signals(builder, NULL);

    g_object_unref(builder);

    gtk_widget_show(window);
    gtk_main();

    return 0;
}

// called when window is closed
void on_window_main_destroy()
{
    gtk_main_quit();
}

我使用编译c代码没有任何错误

gcc main.c $(pkg-config --cflags --libs gtk+-3.0) -o main -export-dynamic

但是当我运行时我得到这个警告但没有 gui

Gtk-CRITICAL **: : gtk_widget_show: 断言 'GTK_IS_WIDGET (widget)' 失败

我该如何解决这个问题?第二个问题是如何从文本框中获取值并使用 c 将其显示在标签中。

【问题讨论】:

    标签: c gtk gtk3 glade


    【解决方案1】:

    您收到的错误消息是因为您的 GtkWindow 具有 id "windows1",而您尝试使用 id "window1" 获取它(请注意,前者中间有一个“s”,而后者没有)。

    对于您的另一个问题:您应该获取 GtkEntry 小部件(也使用gtk_builder_get_object())并将结果指针保存在某处。一旦进入回调,您就可以获取其内容。

    【讨论】:

      猜你喜欢
      • 2012-04-30
      • 2023-03-17
      • 1970-01-01
      • 2011-12-21
      • 2010-10-04
      • 1970-01-01
      • 2022-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多